home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / Compilers / digital marsC compier / dm / stl / stl_algo.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  113.9 KB  |  3,298 lines

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26.  
  27. /* NOTE: This is an internal header file, included by other STL headers.
  28.  *   You should not attempt to use it directly.
  29.  */
  30.  
  31. #ifndef __SGI_STL_INTERNAL_ALGO_H
  32. #define __SGI_STL_INTERNAL_ALGO_H
  33.  
  34. #include <stl_heap.h>
  35.  
  36. // See concept_checks.h for the concept-checking macros 
  37. // __STL_REQUIRES, __STL_CONVERTIBLE, etc.
  38.  
  39.  
  40. __STL_BEGIN_NAMESPACE
  41.  
  42. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  43. #pragma set woff 1209
  44. #endif
  45.  
  46. // __median (an extension, not present in the C++ standard).
  47.  
  48. template <class _Tp>
  49. inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
  50.   __STL_REQUIRES(_Tp, _LessThanComparable);
  51.   if (__a < __b)
  52.     if (__b < __c)
  53.       return __b;
  54.     else if (__a < __c)
  55.       return __c;
  56.     else
  57.       return __a;
  58.   else if (__a < __c)
  59.     return __a;
  60.   else if (__b < __c)
  61.     return __c;
  62.   else
  63.     return __b;
  64. }
  65.  
  66. template <class _Tp, class _Compare>
  67. inline const _Tp&
  68. __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
  69.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  70.   if (__comp(__a, __b))
  71.     if (__comp(__b, __c))
  72.       return __b;
  73.     else if (__comp(__a, __c))
  74.       return __c;
  75.     else
  76.       return __a;
  77.   else if (__comp(__a, __c))
  78.     return __a;
  79.   else if (__comp(__b, __c))
  80.     return __c;
  81.   else
  82.     return __b;
  83. }
  84.  
  85. // for_each.  Apply a function to every element of a range.
  86. template <class _InputIter, class _Function>
  87. _Function for_each(_InputIter __first, _InputIter __last, _Function __f) {
  88.   __STL_REQUIRES(_InputIter, _InputIterator);
  89.   for ( ; __first != __last; ++__first)
  90.     __f(*__first);
  91.   return __f;
  92. }
  93.  
  94. // find and find_if.
  95.  
  96. template <class _InputIter, class _Tp>
  97. inline _InputIter find(_InputIter __first, _InputIter __last,
  98.                        const _Tp& __val,
  99.                        input_iterator_tag)
  100. {
  101.   while (__first != __last && !(*__first == __val))
  102.     ++__first;
  103.   return __first;
  104. }
  105.  
  106. template <class _InputIter, class _Predicate>
  107. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  108.                           _Predicate __pred,
  109.                           input_iterator_tag)
  110. {
  111.   while (__first != __last && !__pred(*__first))
  112.     ++__first;
  113.   return __first;
  114. }
  115.  
  116. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  117.  
  118. template <class _RandomAccessIter, class _Tp>
  119. _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,
  120.                        const _Tp& __val,
  121.                        random_access_iterator_tag)
  122. {
  123.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  124.     = (__last - __first) >> 2;
  125.  
  126.   for ( ; __trip_count > 0 ; --__trip_count) {
  127.     if (*__first == __val) return __first;
  128.     ++__first;
  129.  
  130.     if (*__first == __val) return __first;
  131.     ++__first;
  132.  
  133.     if (*__first == __val) return __first;
  134.     ++__first;
  135.  
  136.     if (*__first == __val) return __first;
  137.     ++__first;
  138.   }
  139.  
  140.   switch(__last - __first) {
  141.   case 3:
  142.     if (*__first == __val) return __first;
  143.     ++__first;
  144.   case 2:
  145.     if (*__first == __val) return __first;
  146.     ++__first;
  147.   case 1:
  148.     if (*__first == __val) return __first;
  149.     ++__first;
  150.   case 0:
  151.   default:
  152.     return __last;
  153.   }
  154. }
  155.  
  156. template <class _RandomAccessIter, class _Predicate>
  157. _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,
  158.                           _Predicate __pred,
  159.                           random_access_iterator_tag)
  160. {
  161.   typename iterator_traits<_RandomAccessIter>::difference_type __trip_count
  162.     = (__last - __first) >> 2;
  163.  
  164.   for ( ; __trip_count > 0 ; --__trip_count) {
  165.     if (__pred(*__first)) return __first;
  166.     ++__first;
  167.  
  168.     if (__pred(*__first)) return __first;
  169.     ++__first;
  170.  
  171.     if (__pred(*__first)) return __first;
  172.     ++__first;
  173.  
  174.     if (__pred(*__first)) return __first;
  175.     ++__first;
  176.   }
  177.  
  178.   switch(__last - __first) {
  179.   case 3:
  180.     if (__pred(*__first)) return __first;
  181.     ++__first;
  182.   case 2:
  183.     if (__pred(*__first)) return __first;
  184.     ++__first;
  185.   case 1:
  186.     if (__pred(*__first)) return __first;
  187.     ++__first;
  188.   case 0:
  189.   default:
  190.     return __last;
  191.   }
  192. }
  193.  
  194. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  195.  
  196. template <class _InputIter, class _Tp>
  197. inline _InputIter find(_InputIter __first, _InputIter __last,
  198.                        const _Tp& __val)
  199. {
  200.   __STL_REQUIRES(_InputIter, _InputIterator);
  201.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, 
  202.             typename iterator_traits<_InputIter>::value_type, _Tp);
  203.   return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));
  204. }
  205.  
  206. template <class _InputIter, class _Predicate>
  207. inline _InputIter find_if(_InputIter __first, _InputIter __last,
  208.                           _Predicate __pred) {
  209.   __STL_REQUIRES(_InputIter, _InputIterator);
  210.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  211.           typename iterator_traits<_InputIter>::value_type);
  212.   return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  213. }
  214.  
  215. // adjacent_find.
  216.  
  217. template <class _ForwardIter>
  218. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
  219.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  220.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  221.                  _EqualityComparable);
  222.   if (__first == __last)
  223.     return __last;
  224.   _ForwardIter __next = __first;
  225.   while(++__next != __last) {
  226.     if (*__first == *__next)
  227.       return __first;
  228.     __first = __next;
  229.   }
  230.   return __last;
  231. }
  232.  
  233. template <class _ForwardIter, class _BinaryPredicate>
  234. _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
  235.                            _BinaryPredicate __binary_pred) {
  236.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  237.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  238.           typename iterator_traits<_ForwardIter>::value_type,
  239.           typename iterator_traits<_ForwardIter>::value_type);
  240.   if (__first == __last)
  241.     return __last;
  242.   _ForwardIter __next = __first;
  243.   while(++__next != __last) {
  244.     if (__binary_pred(*__first, *__next))
  245.       return __first;
  246.     __first = __next;
  247.   }
  248.   return __last;
  249. }
  250.  
  251. // count and count_if.  There are two version of each, one whose return type
  252. // type is void and one (present only if we have partial specialization)
  253. // whose return type is iterator_traits<_InputIter>::difference_type.  The
  254. // C++ standard only has the latter version, but the former, which was present
  255. // in the HP STL, is retained for backward compatibility.
  256.  
  257. template <class _InputIter, class _Tp, class _Size>
  258. void count(_InputIter __first, _InputIter __last, const _Tp& __value,
  259.            _Size& __n) {
  260.   __STL_REQUIRES(_InputIter, _InputIterator);
  261.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  262.                  _EqualityComparable);
  263.   __STL_REQUIRES(_Tp, _EqualityComparable);
  264.   for ( ; __first != __last; ++__first)
  265.     if (*__first == __value)
  266.       ++__n;
  267. }
  268.  
  269. template <class _InputIter, class _Predicate, class _Size>
  270. void count_if(_InputIter __first, _InputIter __last, _Predicate __pred,
  271.               _Size& __n) {
  272.   __STL_REQUIRES(_InputIter, _InputIterator);
  273.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  274.                   typename iterator_traits<_InputIter>::value_type);
  275.   for ( ; __first != __last; ++__first)
  276.     if (__pred(*__first))
  277.       ++__n;
  278. }
  279.  
  280. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  281.  
  282. template <class _InputIter, class _Tp>
  283. typename iterator_traits<_InputIter>::difference_type
  284. count(_InputIter __first, _InputIter __last, const _Tp& __value) {
  285.   __STL_REQUIRES(_InputIter, _InputIterator);
  286.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  287.                  _EqualityComparable);
  288.   __STL_REQUIRES(_Tp, _EqualityComparable);
  289.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  290.   for ( ; __first != __last; ++__first)
  291.     if (*__first == __value)
  292.       ++__n;
  293.   return __n;
  294. }
  295.  
  296. template <class _InputIter, class _Predicate>
  297. typename iterator_traits<_InputIter>::difference_type
  298. count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
  299.   __STL_REQUIRES(_InputIter, _InputIterator);
  300.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  301.                   typename iterator_traits<_InputIter>::value_type);
  302.   typename iterator_traits<_InputIter>::difference_type __n = 0;
  303.   for ( ; __first != __last; ++__first)
  304.     if (__pred(*__first))
  305.       ++__n;
  306.   return __n;
  307. }
  308.  
  309.  
  310. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  311.  
  312. // search.
  313.  
  314. template <class _ForwardIter1, class _ForwardIter2>
  315. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  316.                      _ForwardIter2 __first2, _ForwardIter2 __last2) 
  317. {
  318.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  319.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  320.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  321.    typename iterator_traits<_ForwardIter1>::value_type,
  322.    typename iterator_traits<_ForwardIter2>::value_type);
  323.  
  324.   // Test for empty ranges
  325.   if (__first1 == __last1 || __first2 == __last2)
  326.     return __first1;
  327.  
  328.   // Test for a pattern of length 1.
  329.   _ForwardIter2 __tmp(__first2);
  330.   ++__tmp;
  331.   if (__tmp == __last2)
  332.     return find(__first1, __last1, *__first2);
  333.  
  334.   // General case.
  335.  
  336.   _ForwardIter2 __p1, __p;
  337.  
  338.   __p1 = __first2; ++__p1;
  339.  
  340.   _ForwardIter1 __current = __first1;
  341.  
  342.   while (__first1 != __last1) {
  343.     __first1 = find(__first1, __last1, *__first2);
  344.     if (__first1 == __last1)
  345.       return __last1;
  346.  
  347.     __p = __p1;
  348.     __current = __first1; 
  349.     if (++__current == __last1)
  350.       return __last1;
  351.  
  352.     while (*__current == *__p) {
  353.       if (++__p == __last2)
  354.         return __first1;
  355.       if (++__current == __last1)
  356.         return __last1;
  357.     }
  358.  
  359.     ++__first1;
  360.   }
  361.   return __first1;
  362. }
  363.  
  364. template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
  365. _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
  366.                      _ForwardIter2 __first2, _ForwardIter2 __last2,
  367.                      _BinaryPred  __predicate) 
  368. {
  369.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  370.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  371.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
  372.    typename iterator_traits<_ForwardIter1>::value_type,
  373.    typename iterator_traits<_ForwardIter2>::value_type);
  374.  
  375.   // Test for empty ranges
  376.   if (__first1 == __last1 || __first2 == __last2)
  377.     return __first1;
  378.  
  379.   // Test for a pattern of length 1.
  380.   _ForwardIter2 __tmp(__first2);
  381.   ++__tmp;
  382.   if (__tmp == __last2) {
  383.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  384.       ++__first1;
  385.     return __first1;    
  386.   }
  387.  
  388.   // General case.
  389.  
  390.   _ForwardIter2 __p1, __p;
  391.  
  392.   __p1 = __first2; ++__p1;
  393.  
  394.   _ForwardIter1 __current = __first1;
  395.  
  396.   while (__first1 != __last1) {
  397.     while (__first1 != __last1) {
  398.       if (__predicate(*__first1, *__first2))
  399.         break;
  400.       ++__first1;
  401.     }
  402.     while (__first1 != __last1 && !__predicate(*__first1, *__first2))
  403.       ++__first1;
  404.     if (__first1 == __last1)
  405.       return __last1;
  406.  
  407.     __p = __p1;
  408.     __current = __first1; 
  409.     if (++__current == __last1) return __last1;
  410.  
  411.     while (__predicate(*__current, *__p)) {
  412.       if (++__p == __last2)
  413.         return __first1;
  414.       if (++__current == __last1)
  415.         return __last1;
  416.     }
  417.  
  418.     ++__first1;
  419.   }
  420.   return __first1;
  421. }
  422.  
  423. // search_n.  Search for __count consecutive copies of __val.
  424.  
  425. template <class _ForwardIter, class _Integer, class _Tp>
  426. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  427.                       _Integer __count, const _Tp& __val) {
  428.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  429.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  430.                  _EqualityComparable);
  431.   __STL_REQUIRES(_Tp, _EqualityComparable);
  432.  
  433.   if (__count <= 0)
  434.     return __first;
  435.   else {
  436.     __first = find(__first, __last, __val);
  437.     while (__first != __last) {
  438.       _Integer __n = __count - 1;
  439.       _ForwardIter __i = __first;
  440.       ++__i;
  441.       while (__i != __last && __n != 0 && *__i == __val) {
  442.         ++__i;
  443.         --__n;
  444.       }
  445.       if (__n == 0)
  446.         return __first;
  447.       else
  448.         __first = find(__i, __last, __val);
  449.     }
  450.     return __last;
  451.   }
  452. }
  453.  
  454. template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
  455. _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
  456.                       _Integer __count, const _Tp& __val,
  457.                       _BinaryPred __binary_pred) {
  458.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  459.   __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool, 
  460.              typename iterator_traits<_ForwardIter>::value_type, _Tp);
  461.   if (__count <= 0)
  462.     return __first;
  463.   else {
  464.     while (__first != __last) {
  465.       if (__binary_pred(*__first, __val))
  466.         break;
  467.       ++__first;
  468.     }
  469.     while (__first != __last) {
  470.       _Integer __n = __count - 1;
  471.       _ForwardIter __i = __first;
  472.       ++__i;
  473.       while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
  474.         ++__i;
  475.         --__n;
  476.       }
  477.       if (__n == 0)
  478.         return __first;
  479.       else {
  480.         while (__i != __last) {
  481.           if (__binary_pred(*__i, __val))
  482.             break;
  483.           ++__i;
  484.         }
  485.         __first = __i;
  486.       }
  487.     }
  488.     return __last;
  489.   }
  490.  
  491. // swap_ranges
  492.  
  493. template <class _ForwardIter1, class _ForwardIter2>
  494. _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
  495.                           _ForwardIter2 __first2) {
  496.   __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
  497.   __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
  498.   __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
  499.                     typename iterator_traits<_ForwardIter2>::value_type);
  500.   __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
  501.                     typename iterator_traits<_ForwardIter1>::value_type);
  502.   for ( ; __first1 != __last1; ++__first1, ++__first2)
  503.     iter_swap(__first1, __first2);
  504.   return __first2;
  505. }
  506.  
  507. // transform
  508.  
  509. template <class _InputIter, class _OutputIter, class _UnaryOperation>
  510. _OutputIter transform(_InputIter __first, _InputIter __last,
  511.                       _OutputIter __result, _UnaryOperation __opr) {
  512.   __STL_REQUIRES(_InputIter, _InputIterator);
  513.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  514.  
  515.   for ( ; __first != __last; ++__first, ++__result)
  516.     *__result = __opr(*__first);
  517.   return __result;
  518. }
  519.  
  520. template <class _InputIter1, class _InputIter2, class _OutputIter,
  521.           class _BinaryOperation>
  522. _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1,
  523.                       _InputIter2 __first2, _OutputIter __result,
  524.                       _BinaryOperation __binary_op) {
  525.   __STL_REQUIRES(_InputIter1, _InputIterator);
  526.   __STL_REQUIRES(_InputIter2, _InputIterator);
  527.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  528.   for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
  529.     *__result = __binary_op(*__first1, *__first2);
  530.   return __result;
  531. }
  532.  
  533. // replace, replace_if, replace_copy, replace_copy_if
  534.  
  535. template <class _ForwardIter, class _Tp>
  536. void replace(_ForwardIter __first, _ForwardIter __last,
  537.              const _Tp& __old_value, const _Tp& __new_value) {
  538.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  539.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  540.          typename iterator_traits<_ForwardIter>::value_type, _Tp);
  541.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  542.   for ( ; __first != __last; ++__first)
  543.     if (*__first == __old_value)
  544.       *__first = __new_value;
  545. }
  546.  
  547. template <class _ForwardIter, class _Predicate, class _Tp>
  548. void replace_if(_ForwardIter __first, _ForwardIter __last,
  549.                 _Predicate __pred, const _Tp& __new_value) {
  550.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  551.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  552.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  553.              typename iterator_traits<_ForwardIter>::value_type);
  554.   for ( ; __first != __last; ++__first)
  555.     if (__pred(*__first))
  556.       *__first = __new_value;
  557. }
  558.  
  559. template <class _InputIter, class _OutputIter, class _Tp>
  560. _OutputIter replace_copy(_InputIter __first, _InputIter __last,
  561.                          _OutputIter __result,
  562.                          const _Tp& __old_value, const _Tp& __new_value) {
  563.   __STL_REQUIRES(_InputIter, _InputIterator);
  564.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  565.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  566.          typename iterator_traits<_InputIter>::value_type, _Tp);
  567.   for ( ; __first != __last; ++__first, ++__result)
  568.     *__result = *__first == __old_value ? __new_value : *__first;
  569.   return __result;
  570. }
  571.  
  572. template <class _InputIter, class _OutputIter, class _Predicate, class _Tp>
  573. _OutputIter replace_copy_if(_InputIter __first, _InputIter __last,
  574.                             _OutputIter __result,
  575.                             _Predicate __pred, const _Tp& __new_value) {
  576.   __STL_REQUIRES(_InputIter, _InputIterator);
  577.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  578.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  579.                 typename iterator_traits<_InputIter>::value_type);
  580.   for ( ; __first != __last; ++__first, ++__result)
  581.     *__result = __pred(*__first) ? __new_value : *__first;
  582.   return __result;
  583. }
  584.  
  585. // generate and generate_n
  586.  
  587. template <class _ForwardIter, class _Generator>
  588. void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
  589.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  590.   __STL_GENERATOR_CHECK(_Generator, 
  591.           typename iterator_traits<_ForwardIter>::value_type);
  592.   for ( ; __first != __last; ++__first)
  593.     *__first = __gen();
  594. }
  595.  
  596. template <class _OutputIter, class _Size, class _Generator>
  597. _OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
  598.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  599.   for ( ; __n > 0; --__n, ++__first)
  600.     *__first = __gen();
  601.   return __first;
  602. }
  603.  
  604. // remove, remove_if, remove_copy, remove_copy_if
  605.  
  606. template <class _InputIter, class _OutputIter, class _Tp>
  607. _OutputIter remove_copy(_InputIter __first, _InputIter __last,
  608.                         _OutputIter __result, const _Tp& __value) {
  609.   __STL_REQUIRES(_InputIter, _InputIterator);
  610.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  611.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  612.        typename iterator_traits<_InputIter>::value_type, _Tp);
  613.   for ( ; __first != __last; ++__first)
  614.     if (!(*__first == __value)) {
  615.       *__result = *__first;
  616.       ++__result;
  617.     }
  618.   return __result;
  619. }
  620.  
  621. template <class _InputIter, class _OutputIter, class _Predicate>
  622. _OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
  623.                            _OutputIter __result, _Predicate __pred) {
  624.   __STL_REQUIRES(_InputIter, _InputIterator);
  625.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  626.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  627.              typename iterator_traits<_InputIter>::value_type);
  628.   for ( ; __first != __last; ++__first)
  629.     if (!__pred(*__first)) {
  630.       *__result = *__first;
  631.       ++__result;
  632.     }
  633.   return __result;
  634. }
  635.  
  636. template <class _ForwardIter, class _Tp>
  637. _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
  638.                     const _Tp& __value) {
  639.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  640.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  641.        typename iterator_traits<_ForwardIter>::value_type, _Tp);
  642.   __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
  643.   __first = find(__first, __last, __value);
  644.   _ForwardIter __i = __first;
  645.   return __first == __last ? __first 
  646.                            : remove_copy(++__i, __last, __first, __value);
  647. }
  648.  
  649. template <class _ForwardIter, class _Predicate>
  650. _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
  651.                        _Predicate __pred) {
  652.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  653.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  654.                typename iterator_traits<_ForwardIter>::value_type);
  655.   __first = find_if(__first, __last, __pred);
  656.   _ForwardIter __i = __first;
  657.   return __first == __last ? __first 
  658.                            : remove_copy_if(++__i, __last, __first, __pred);
  659. }
  660.  
  661. // unique and unique_copy
  662.  
  663. template <class _InputIter, class _OutputIter, class _Tp>
  664. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  665.                           _OutputIter __result, _Tp*) {
  666.   _Tp __value = *__first;
  667.   *__result = __value;
  668.   while (++__first != __last)
  669.     if (!(__value == *__first)) {
  670.       __value = *__first;
  671.       *++__result = __value;
  672.     }
  673.   return ++__result;
  674. }
  675.  
  676. template <class _InputIter, class _OutputIter>
  677. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  678.                                  _OutputIter __result, 
  679.                                  output_iterator_tag) {
  680.   return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first));
  681. }
  682.  
  683. template <class _InputIter, class _ForwardIter>
  684. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  685.                            _ForwardIter __result, forward_iterator_tag) {
  686.   *__result = *__first;
  687.   while (++__first != __last)
  688.     if (!(*__result == *__first))
  689.       *++__result = *__first;
  690.   return ++__result;
  691. }
  692.  
  693. template <class _InputIter, class _OutputIter>
  694. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  695.                                _OutputIter __result) {
  696.   __STL_REQUIRES(_InputIter, _InputIterator);
  697.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  698.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  699.                  _EqualityComparable);
  700.   if (__first == __last) return __result;
  701.   return __unique_copy(__first, __last, __result,
  702.                        __ITERATOR_CATEGORY(__result));
  703. }
  704.  
  705. template <class _InputIter, class _OutputIter, class _BinaryPredicate,
  706.           class _Tp>
  707. _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  708.                           _OutputIter __result,
  709.                           _BinaryPredicate __binary_pred, _Tp*) {
  710.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, _Tp, _Tp);
  711.   _Tp __value = *__first;
  712.   *__result = __value;
  713.   while (++__first != __last)
  714.     if (!__binary_pred(__value, *__first)) {
  715.       __value = *__first;
  716.       *++__result = __value;
  717.     }
  718.   return ++__result;
  719. }
  720.  
  721. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  722. inline _OutputIter __unique_copy(_InputIter __first, _InputIter __last,
  723.                                  _OutputIter __result,
  724.                                  _BinaryPredicate __binary_pred,
  725.                                  output_iterator_tag) {
  726.   return __unique_copy(__first, __last, __result, __binary_pred,
  727.                        __VALUE_TYPE(__first));
  728. }
  729.  
  730. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  731. _ForwardIter __unique_copy(_InputIter __first, _InputIter __last,
  732.                            _ForwardIter __result, 
  733.                            _BinaryPredicate __binary_pred,
  734.                            forward_iterator_tag) {
  735.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  736.      typename iterator_traits<_ForwardIter>::value_type,
  737.      typename iterator_traits<_InputIter>::value_type);
  738.   *__result = *__first;
  739.   while (++__first != __last)
  740.     if (!__binary_pred(*__result, *__first)) *++__result = *__first;
  741.   return ++__result;
  742. }
  743.  
  744. template <class _InputIter, class _OutputIter, class _BinaryPredicate>
  745. inline _OutputIter unique_copy(_InputIter __first, _InputIter __last,
  746.                                _OutputIter __result,
  747.                                _BinaryPredicate __binary_pred) {
  748.   __STL_REQUIRES(_InputIter, _InputIterator);
  749.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  750.   if (__first == __last) return __result;
  751.   return __unique_copy(__first, __last, __result, __binary_pred,
  752.                        __ITERATOR_CATEGORY(__result));
  753. }
  754.  
  755. template <class _ForwardIter>
  756. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
  757.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  758.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  759.                  _EqualityComparable);
  760.   __first = adjacent_find(__first, __last);
  761.   return unique_copy(__first, __last, __first);
  762. }
  763.  
  764. template <class _ForwardIter, class _BinaryPredicate>
  765. _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
  766.                     _BinaryPredicate __binary_pred) {
  767.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  768.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, 
  769.       typename iterator_traits<_ForwardIter>::value_type,
  770.       typename iterator_traits<_ForwardIter>::value_type);
  771.   __first = adjacent_find(__first, __last, __binary_pred);
  772.   return unique_copy(__first, __last, __first, __binary_pred);
  773. }
  774.  
  775. // reverse and reverse_copy, and their auxiliary functions
  776.  
  777. template <class _BidirectionalIter>
  778. void __reverse(_BidirectionalIter __first, _BidirectionalIter __last, 
  779.                bidirectional_iterator_tag) {
  780.   while (true)
  781.     if (__first == __last || __first == --__last)
  782.       return;
  783.     else
  784.       iter_swap(__first++, __last);
  785. }
  786.  
  787. template <class _RandomAccessIter>
  788. void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
  789.                random_access_iterator_tag) {
  790.   while (__first < __last)
  791.     iter_swap(__first++, --__last);
  792. }
  793.  
  794. template <class _BidirectionalIter>
  795. inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
  796.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  797.   __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
  798. }
  799.  
  800. template <class _BidirectionalIter, class _OutputIter>
  801. _OutputIter reverse_copy(_BidirectionalIter __first,
  802.                          _BidirectionalIter __last,
  803.                          _OutputIter __result) {
  804.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  805.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  806.   while (__first != __last) {
  807.     --__last;
  808.     *__result = *__last;
  809.     ++__result;
  810.   }
  811.   return __result;
  812. }
  813.  
  814. // rotate and rotate_copy, and their auxiliary functions
  815.  
  816. template <class _EuclideanRingElement>
  817. _EuclideanRingElement __gcd(_EuclideanRingElement __m,
  818.                             _EuclideanRingElement __n)
  819. {
  820.   while (__n != 0) {
  821.     _EuclideanRingElement __t = __m % __n;
  822.     __m = __n;
  823.     __n = __t;
  824.   }
  825.   return __m;
  826. }
  827.  
  828. template <class _ForwardIter, class _Distance>
  829. _ForwardIter __rotate(_ForwardIter __first,
  830.                       _ForwardIter __middle,
  831.                       _ForwardIter __last,
  832.                       _Distance*,
  833.                       forward_iterator_tag) {
  834.   if (__first == __middle)
  835.     return __last;
  836.   if (__last  == __middle)
  837.     return __first;
  838.  
  839.   _ForwardIter __first2 = __middle;
  840.   do {
  841.     swap(*__first++, *__first2++);
  842.     if (__first == __middle)
  843.       __middle = __first2;
  844.   } while (__first2 != __last);
  845.  
  846.   _ForwardIter __new_middle = __first;
  847.  
  848.   __first2 = __middle;
  849.  
  850.   while (__first2 != __last) {
  851.     swap (*__first++, *__first2++);
  852.     if (__first == __middle)
  853.       __middle = __first2;
  854.     else if (__first2 == __last)
  855.       __first2 = __middle;
  856.   }
  857.  
  858.   return __new_middle;
  859. }
  860.  
  861.  
  862. template <class _BidirectionalIter, class _Distance>
  863. _BidirectionalIter __rotate(_BidirectionalIter __first,
  864.                             _BidirectionalIter __middle,
  865.                             _BidirectionalIter __last,
  866.                             _Distance*,
  867.                             bidirectional_iterator_tag) {
  868.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  869.   if (__first == __middle)
  870.     return __last;
  871.   if (__last  == __middle)
  872.     return __first;
  873.  
  874.   __reverse(__first,  __middle, bidirectional_iterator_tag());
  875.   __reverse(__middle, __last,   bidirectional_iterator_tag());
  876.  
  877.   while (__first != __middle && __middle != __last)
  878.     swap (*__first++, *--__last);
  879.  
  880.   if (__first == __middle) {
  881.     __reverse(__middle, __last,   bidirectional_iterator_tag());
  882.     return __last;
  883.   }
  884.   else {
  885.     __reverse(__first,  __middle, bidirectional_iterator_tag());
  886.     return __first;
  887.   }
  888. }
  889.  
  890. template <class _RandomAccessIter, class _Distance, class _Tp>
  891. _RandomAccessIter __rotate(_RandomAccessIter __first,
  892.                            _RandomAccessIter __middle,
  893.                            _RandomAccessIter __last,
  894.                            _Distance *, _Tp *) {
  895.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  896.   _Distance __n = __last   - __first;
  897.   _Distance __k = __middle - __first;
  898.   _Distance __l = __n - __k;
  899.   _RandomAccessIter __result = __first + (__last - __middle);
  900.  
  901.   if (__k == 0)
  902.     return __last;
  903.  
  904.   else if (__k == __l) {
  905.     swap_ranges(__first, __middle, __middle);
  906.     return __result;
  907.   }
  908.  
  909.   _Distance __d = __gcd(__n, __k);
  910.  
  911.   for (_Distance __i = 0; __i < __d; __i++) {
  912.     _Tp __tmp = *__first;
  913.     _RandomAccessIter __p = __first;
  914.  
  915.     if (__k < __l) {
  916.       for (_Distance __j = 0; __j < __l/__d; __j++) {
  917.         if (__p > __first + __l) {
  918.           *__p = *(__p - __l);
  919.           __p -= __l;
  920.         }
  921.  
  922.         *__p = *(__p + __k);
  923.         __p += __k;
  924.       }
  925.     }
  926.  
  927.     else {
  928.       for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
  929.         if (__p < __last - __k) {
  930.           *__p = *(__p + __k);
  931.           __p += __k;
  932.         }
  933.  
  934.         *__p = * (__p - __l);
  935.         __p -= __l;
  936.       }
  937.     }
  938.  
  939.     *__p = __tmp;
  940.     ++__first;
  941.   }
  942.  
  943.   return __result;
  944. }
  945.  
  946. template <class _ForwardIter>
  947. inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
  948.                            _ForwardIter __last) {
  949.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  950.   return __rotate(__first, __middle, __last,
  951.                   __DISTANCE_TYPE(__first),
  952.                   __ITERATOR_CATEGORY(__first));
  953. }
  954.  
  955. template <class _ForwardIter, class _OutputIter>
  956. _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
  957.                         _ForwardIter __last, _OutputIter __result) {
  958.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  959.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  960.   return copy(__first, __middle, copy(__middle, __last, __result));
  961. }
  962.  
  963. // Return a random number in the range [0, __n).  This function encapsulates
  964. // whether we're using rand (part of the standard C library) or lrand48
  965. // (not standard, but a much better choice whenever it's available).
  966.  
  967. template <class _Distance>
  968. inline _Distance __random_number(_Distance __n) {
  969. #ifdef __STL_NO_DRAND48
  970.   return rand() % __n;
  971. #else
  972.   return lrand48() % __n;
  973. #endif
  974. }
  975.  
  976. // random_shuffle
  977.  
  978. template <class _RandomAccessIter>
  979. inline void random_shuffle(_RandomAccessIter __first,
  980.                            _RandomAccessIter __last) {
  981.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  982.   if (__first == __last) return;
  983.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  984.     iter_swap(__i, __first + __random_number((__i - __first) + 1));
  985. }
  986.  
  987. template <class _RandomAccessIter, class _RandomNumberGenerator>
  988. void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
  989.                     _RandomNumberGenerator& __rand) {
  990.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  991.   if (__first == __last) return;
  992.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  993.     iter_swap(__i, __first + __rand((__i - __first) + 1));
  994. }
  995.  
  996. // random_sample and random_sample_n (extensions, not part of the standard).
  997.  
  998. template <class _ForwardIter, class _OutputIter, class _Distance>
  999. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  1000.                             _OutputIter __stl__out, const _Distance __n)
  1001. {
  1002.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1003.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  1004.   _Distance __remaining = 0;
  1005.   distance(__first, __last, __remaining);
  1006.   _Distance __m = min(__n, __remaining);
  1007.  
  1008.   while (__m > 0) {
  1009.     if (__random_number(__remaining) < __m) {
  1010.       *__stl__out = *__first;
  1011.       ++__stl__out;
  1012.       --__m;
  1013.     }
  1014.  
  1015.     --__remaining;
  1016.     ++__first;
  1017.   }
  1018.   return __stl__out;
  1019. }
  1020.  
  1021. template <class _ForwardIter, class _OutputIter, class _Distance,
  1022.           class _RandomNumberGenerator>
  1023. _OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
  1024.                             _OutputIter __stl__out, const _Distance __n,
  1025.                             _RandomNumberGenerator& __rand)
  1026. {
  1027.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1028.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  1029.   __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
  1030.   _Distance __remaining = 0;
  1031.   distance(__first, __last, __remaining);
  1032.   _Distance __m = min(__n, __remaining);
  1033.  
  1034.   while (__m > 0) {
  1035.     if (__rand(__remaining) < __m) {
  1036.       *__stl__out = *__first;
  1037.       ++__stl__out;
  1038.       --__m;
  1039.     }
  1040.  
  1041.     --__remaining;
  1042.     ++__first;
  1043.   }
  1044.   return __stl__out;
  1045. }
  1046.  
  1047. template <class _InputIter, class _RandomAccessIter, class _Distance>
  1048. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  1049.                                   _RandomAccessIter __stl__out,
  1050.                                   const _Distance __n)
  1051. {
  1052.   _Distance __m = 0;
  1053.   _Distance __t = __n;
  1054.   for ( ; __first != __last && __m < __n; ++__m, ++__first) 
  1055.     __stl__out[__m] = *__first;
  1056.  
  1057.   while (__first != __last) {
  1058.     ++__t;
  1059.     _Distance __M = __random_number(__t);
  1060.     if (__M < __n)
  1061.       __stl__out[__M] = *__first;
  1062.     ++__first;
  1063.   }
  1064.  
  1065.   return __stl__out + __m;
  1066. }
  1067.  
  1068. template <class _InputIter, class _RandomAccessIter,
  1069.           class _RandomNumberGenerator, class _Distance>
  1070. _RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
  1071.                                   _RandomAccessIter __stl__out,
  1072.                                   _RandomNumberGenerator& __rand,
  1073.                                   const _Distance __n)
  1074. {
  1075.   __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
  1076.   _Distance __m = 0;
  1077.   _Distance __t = __n;
  1078.   for ( ; __first != __last && __m < __n; ++__m, ++__first)
  1079.     __stl__out[__m] = *__first;
  1080.  
  1081.   while (__first != __last) {
  1082.     ++__t;
  1083.     _Distance __M = __rand(__t);
  1084.     if (__M < __n)
  1085.       __stl__out[__M] = *__first;
  1086.     ++__first;
  1087.   }
  1088.  
  1089.   return __stl__out + __m;
  1090. }
  1091.  
  1092. template <class _InputIter, class _RandomAccessIter>
  1093. inline _RandomAccessIter
  1094. random_sample(_InputIter __first, _InputIter __last,
  1095.               _RandomAccessIter __out_first, _RandomAccessIter __out_last) 
  1096. {
  1097.   __STL_REQUIRES(_InputIter, _InputIterator);
  1098.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1099.   return __random_sample(__first, __last,
  1100.                          __out_first, __out_last - __out_first);
  1101. }
  1102.  
  1103.  
  1104. template <class _InputIter, class _RandomAccessIter, 
  1105.           class _RandomNumberGenerator>
  1106. inline _RandomAccessIter
  1107. random_sample(_InputIter __first, _InputIter __last,
  1108.               _RandomAccessIter __out_first, _RandomAccessIter __out_last,
  1109.               _RandomNumberGenerator& __rand) 
  1110. {
  1111.   __STL_REQUIRES(_InputIter, _InputIterator);
  1112.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1113.   return __random_sample(__first, __last,
  1114.                          __out_first, __rand,
  1115.                          __out_last - __out_first);
  1116. }
  1117.  
  1118. // partition, stable_partition, and their auxiliary functions
  1119.  
  1120. template <class _ForwardIter, class _Predicate>
  1121. _ForwardIter __partition(_ForwardIter __first,
  1122.                  _ForwardIter __last,
  1123.              _Predicate   __pred,
  1124.              forward_iterator_tag) {
  1125.   if (__first == __last) return __first;
  1126.  
  1127.   while (__pred(*__first))
  1128.     if (++__first == __last) return __first;
  1129.  
  1130.   _ForwardIter __next = __first;
  1131.  
  1132.   while (++__next != __last)
  1133.     if (__pred(*__next)) {
  1134.       swap(*__first, *__next);
  1135.       ++__first;
  1136.     }
  1137.  
  1138.   return __first;
  1139. }
  1140.  
  1141. template <class _BidirectionalIter, class _Predicate>
  1142. _BidirectionalIter __partition(_BidirectionalIter __first,
  1143.                                _BidirectionalIter __last,
  1144.                    _Predicate __pred,
  1145.                    bidirectional_iterator_tag) {
  1146.   while (true) {
  1147.     while (true)
  1148.       if (__first == __last)
  1149.         return __first;
  1150.       else if (__pred(*__first))
  1151.         ++__first;
  1152.       else
  1153.         break;
  1154.     --__last;
  1155.     while (true)
  1156.       if (__first == __last)
  1157.         return __first;
  1158.       else if (!__pred(*__last))
  1159.         --__last;
  1160.       else
  1161.         break;
  1162.     iter_swap(__first, __last);
  1163.     ++__first;
  1164.   }
  1165. }
  1166.  
  1167. template <class _ForwardIter, class _Predicate>
  1168. inline _ForwardIter partition(_ForwardIter __first,
  1169.                      _ForwardIter __last,
  1170.                   _Predicate   __pred) {
  1171.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  1172.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool, 
  1173.         typename iterator_traits<_ForwardIter>::value_type);
  1174.   return __partition(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
  1175. }
  1176.  
  1177.  
  1178. template <class _ForwardIter, class _Predicate, class _Distance>
  1179. _ForwardIter __inplace_stable_partition(_ForwardIter __first,
  1180.                                         _ForwardIter __last,
  1181.                                         _Predicate __pred, _Distance __len) {
  1182.   if (__len == 1)
  1183.     return __pred(*__first) ? __last : __first;
  1184.   _ForwardIter __middle = __first;
  1185.   advance(__middle, __len / 2);
  1186.   return rotate(__inplace_stable_partition(__first, __middle, __pred, 
  1187.                                            __len / 2),
  1188.                 __middle,
  1189.                 __inplace_stable_partition(__middle, __last, __pred,
  1190.                                            __len - __len / 2));
  1191. }
  1192.  
  1193. template <class _ForwardIter, class _Pointer, class _Predicate, 
  1194.           class _Distance>
  1195. _ForwardIter __stable_partition_adaptive(_ForwardIter __first,
  1196.                                          _ForwardIter __last,
  1197.                                          _Predicate __pred, _Distance __len,
  1198.                                          _Pointer __buffer,
  1199.                                          _Distance __buffer_size) 
  1200. {
  1201.   if (__len <= __buffer_size) {
  1202.     _ForwardIter __result1 = __first;
  1203.     _Pointer __result2 = __buffer;
  1204.     for ( ; __first != __last ; ++__first)
  1205.       if (__pred(*__first)) {
  1206.         *__result1 = *__first;
  1207.         ++__result1;
  1208.       }
  1209.       else {
  1210.         *__result2 = *__first;
  1211.         ++__result2;
  1212.       }
  1213.     copy(__buffer, __result2, __result1);
  1214.     return __result1;
  1215.   }
  1216.   else {
  1217.     _ForwardIter __middle = __first;
  1218.     advance(__middle, __len / 2);
  1219.     return rotate(__stable_partition_adaptive(
  1220.                           __first, __middle, __pred,
  1221.                           __len / 2, __buffer, __buffer_size),
  1222.                     __middle,
  1223.                     __stable_partition_adaptive(
  1224.                           __middle, __last, __pred,
  1225.                           __len - __len / 2, __buffer, __buffer_size));
  1226.   }
  1227. }
  1228.  
  1229. template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
  1230. inline _ForwardIter
  1231. __stable_partition_aux(_ForwardIter __first, _ForwardIter __last, 
  1232.                        _Predicate __pred, _Tp*, _Distance*)
  1233. {
  1234.   _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
  1235.   if (__buf.size() > 0)
  1236.     return __stable_partition_adaptive(__first, __last, __pred,
  1237.                                        _Distance(__buf.requested_size()),
  1238.                                        __buf.begin(), __buf.size());
  1239.   else
  1240.     return __inplace_stable_partition(__first, __last, __pred, 
  1241.                                       _Distance(__buf.requested_size()));
  1242. }
  1243.  
  1244. template <class _ForwardIter, class _Predicate>
  1245. inline _ForwardIter stable_partition(_ForwardIter __first,
  1246.                                      _ForwardIter __last, 
  1247.                                      _Predicate __pred) {
  1248.   __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
  1249.   __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
  1250.       typename iterator_traits<_ForwardIter>::value_type);
  1251.   if (__first == __last)
  1252.     return __first;
  1253.   else
  1254.     return __stable_partition_aux(__first, __last, __pred,
  1255.                                   __VALUE_TYPE(__first),
  1256.                                   __DISTANCE_TYPE(__first));
  1257. }
  1258.  
  1259. template <class _RandomAccessIter, class _Tp>
  1260. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  1261.                                         _RandomAccessIter __last, 
  1262.                                         _Tp __pivot) 
  1263. {
  1264.   while (true) {
  1265.     while (*__first < __pivot)
  1266.       ++__first;
  1267.     --__last;
  1268.     while (__pivot < *__last)
  1269.       --__last;
  1270.     if (!(__first < __last))
  1271.       return __first;
  1272.     iter_swap(__first, __last);
  1273.     ++__first;
  1274.   }
  1275. }    
  1276.  
  1277. template <class _RandomAccessIter, class _Tp, class _Compare>
  1278. _RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
  1279.                                         _RandomAccessIter __last, 
  1280.                                         _Tp __pivot, _Compare __comp) 
  1281. {
  1282.   while (true) {
  1283.     while (__comp(*__first, __pivot))
  1284.       ++__first;
  1285.     --__last;
  1286.     while (__comp(__pivot, *__last))
  1287.       --__last;
  1288.     if (!(__first < __last))
  1289.       return __first;
  1290.     iter_swap(__first, __last);
  1291.     ++__first;
  1292.   }
  1293. }
  1294.  
  1295. const int __stl_threshold = 16;
  1296.  
  1297. // sort() and its auxiliary functions. 
  1298.  
  1299. template <class _RandomAccessIter, class _Tp>
  1300. void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
  1301.   _RandomAccessIter __next = __last;
  1302.   --__next;
  1303.   while (__val < *__next) {
  1304.     *__last = *__next;
  1305.     __last = __next;
  1306.     --__next;
  1307.   }
  1308.   *__last = __val;
  1309. }
  1310.  
  1311. template <class _RandomAccessIter, class _Tp, class _Compare>
  1312. void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, 
  1313.                                _Compare __comp) {
  1314.   _RandomAccessIter __next = __last;
  1315.   --__next;  
  1316.   while (__comp(__val, *__next)) {
  1317.     *__last = *__next;
  1318.     __last = __next;
  1319.     --__next;
  1320.   }
  1321.   *__last = __val;
  1322. }
  1323.  
  1324. template <class _RandomAccessIter, class _Tp>
  1325. inline void __linear_insert(_RandomAccessIter __first, 
  1326.                             _RandomAccessIter __last, _Tp*) {
  1327.   _Tp __val = *__last;
  1328.   if (__val < *__first) {
  1329.     copy_backward(__first, __last, __last + 1);
  1330.     *__first = __val;
  1331.   }
  1332.   else
  1333.     __unguarded_linear_insert(__last, __val);
  1334. }
  1335.  
  1336. template <class _RandomAccessIter, class _Tp, class _Compare>
  1337. inline void __linear_insert(_RandomAccessIter __first, 
  1338.                             _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1339.   _Tp __val = *__last;
  1340.   if (__comp(__val, *__first)) {
  1341.     copy_backward(__first, __last, __last + 1);
  1342.     *__first = __val;
  1343.   }
  1344.   else
  1345.     __unguarded_linear_insert(__last, __val, __comp);
  1346. }
  1347.  
  1348. template <class _RandomAccessIter>
  1349. void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  1350.   if (__first == __last) return; 
  1351.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  1352.     __linear_insert(__first, __i, __VALUE_TYPE(__first));
  1353. }
  1354.  
  1355. template <class _RandomAccessIter, class _Compare>
  1356. void __insertion_sort(_RandomAccessIter __first,
  1357.                       _RandomAccessIter __last, _Compare __comp) {
  1358.   if (__first == __last) return;
  1359.   for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  1360.     __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);
  1361. }
  1362.  
  1363. template <class _RandomAccessIter, class _Tp>
  1364. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  1365.                                     _RandomAccessIter __last, _Tp*) {
  1366.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  1367.     __unguarded_linear_insert(__i, _Tp(*__i));
  1368. }
  1369.  
  1370. template <class _RandomAccessIter>
  1371. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  1372.                                 _RandomAccessIter __last) {
  1373.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
  1374. }
  1375.  
  1376. template <class _RandomAccessIter, class _Tp, class _Compare>
  1377. void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
  1378.                                     _RandomAccessIter __last,
  1379.                                     _Tp*, _Compare __comp) {
  1380.   for (_RandomAccessIter __i = __first; __i != __last; ++__i)
  1381.     __unguarded_linear_insert(__i, _Tp(*__i), __comp);
  1382. }
  1383.  
  1384. template <class _RandomAccessIter, class _Compare>
  1385. inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
  1386.                                        _RandomAccessIter __last,
  1387.                                        _Compare __comp) {
  1388.   __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),
  1389.                                  __comp);
  1390. }
  1391.  
  1392. template <class _RandomAccessIter>
  1393. void __final_insertion_sort(_RandomAccessIter __first, 
  1394.                             _RandomAccessIter __last) {
  1395.   if (__last - __first > __stl_threshold) {
  1396.     __insertion_sort(__first, __first + __stl_threshold);
  1397.     __unguarded_insertion_sort(__first + __stl_threshold, __last);
  1398.   }
  1399.   else
  1400.     __insertion_sort(__first, __last);
  1401. }
  1402.  
  1403. template <class _RandomAccessIter, class _Compare>
  1404. void __final_insertion_sort(_RandomAccessIter __first, 
  1405.                             _RandomAccessIter __last, _Compare __comp) {
  1406.   if (__last - __first > __stl_threshold) {
  1407.     __insertion_sort(__first, __first + __stl_threshold, __comp);
  1408.     __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
  1409.   }
  1410.   else
  1411.     __insertion_sort(__first, __last, __comp);
  1412. }
  1413.  
  1414. template <class _Size>
  1415. inline _Size __lg(_Size __n) {
  1416.   _Size __k;
  1417.   for (__k = 0; __n != 1; __n >>= 1) ++__k;
  1418.   return __k;
  1419. }
  1420.  
  1421. template <class _RandomAccessIter, class _Tp, class _Size>
  1422. void __introsort_loop(_RandomAccessIter __first,
  1423.                       _RandomAccessIter __last, _Tp*,
  1424.                       _Size __depth_limit)
  1425. {
  1426.   while (__last - __first > __stl_threshold) {
  1427.     if (__depth_limit == 0) {
  1428.       partial_sort(__first, __last, __last);
  1429.       return;
  1430.     }
  1431.     --__depth_limit;
  1432.     _RandomAccessIter __cut =
  1433.       __unguarded_partition(__first, __last,
  1434.                             _Tp(__median(*__first,
  1435.                                          *(__first + (__last - __first)/2),
  1436.                                          *(__last - 1))));
  1437.     __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
  1438.     __last = __cut;
  1439.   }
  1440. }
  1441.  
  1442. template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
  1443. void __introsort_loop(_RandomAccessIter __first,
  1444.                       _RandomAccessIter __last, _Tp*,
  1445.                       _Size __depth_limit, _Compare __comp)
  1446. {
  1447.   while (__last - __first > __stl_threshold) {
  1448.     if (__depth_limit == 0) {
  1449.       partial_sort(__first, __last, __last, __comp);
  1450.       return;
  1451.     }
  1452.     --__depth_limit;
  1453.     _RandomAccessIter __cut =
  1454.       __unguarded_partition(__first, __last,
  1455.                             _Tp(__median(*__first,
  1456.                                          *(__first + (__last - __first)/2),
  1457.                                          *(__last - 1), __comp)),
  1458.        __comp);
  1459.     __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
  1460.     __last = __cut;
  1461.   }
  1462. }
  1463.  
  1464. template <class _RandomAccessIter>
  1465. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
  1466.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1467.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1468.                  _LessThanComparable);
  1469.   if (__first != __last) {
  1470.     __introsort_loop(__first, __last,
  1471.                      __VALUE_TYPE(__first),
  1472.                      __lg(__last - __first) * 2);
  1473.     __final_insertion_sort(__first, __last);
  1474.   }
  1475. }
  1476.  
  1477. template <class _RandomAccessIter, class _Compare>
  1478. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
  1479.                  _Compare __comp) {
  1480.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1481.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1482.        typename iterator_traits<_RandomAccessIter>::value_type,
  1483.        typename iterator_traits<_RandomAccessIter>::value_type);
  1484.   if (__first != __last) {
  1485.     __introsort_loop(__first, __last,
  1486.                      __VALUE_TYPE(__first),
  1487.                      __lg(__last - __first) * 2,
  1488.                      __comp);
  1489.     __final_insertion_sort(__first, __last, __comp);
  1490.   }
  1491. }
  1492.  
  1493. // stable_sort() and its auxiliary functions.
  1494.  
  1495. template <class _RandomAccessIter>
  1496. void __inplace_stable_sort(_RandomAccessIter __first,
  1497.                            _RandomAccessIter __last) {
  1498.   if (__last - __first < 15) {
  1499.     __insertion_sort(__first, __last);
  1500.     return;
  1501.   }
  1502.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1503.   __inplace_stable_sort(__first, __middle);
  1504.   __inplace_stable_sort(__middle, __last);
  1505.   __merge_without_buffer(__first, __middle, __last,
  1506.                          __middle - __first,
  1507.                          __last - __middle);
  1508. }
  1509.  
  1510. template <class _RandomAccessIter, class _Compare>
  1511. void __inplace_stable_sort(_RandomAccessIter __first,
  1512.                            _RandomAccessIter __last, _Compare __comp) {
  1513.   if (__last - __first < 15) {
  1514.     __insertion_sort(__first, __last, __comp);
  1515.     return;
  1516.   }
  1517.   _RandomAccessIter __middle = __first + (__last - __first) / 2;
  1518.   __inplace_stable_sort(__first, __middle, __comp);
  1519.   __inplace_stable_sort(__middle, __last, __comp);
  1520.   __merge_without_buffer(__first, __middle, __last,
  1521.                          __middle - __first,
  1522.                          __last - __middle,
  1523.                          __comp);
  1524. }
  1525.  
  1526. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1527.           class _Distance>
  1528. void __merge_sort_loop(_RandomAccessIter1 __first,
  1529.                        _RandomAccessIter1 __last, 
  1530.                        _RandomAccessIter2 __result, _Distance __step_size) {
  1531.   _Distance __two_step = 2 * __step_size;
  1532.  
  1533.   while (__last - __first >= __two_step) {
  1534.     __result = merge(__first, __first + __step_size,
  1535.                      __first + __step_size, __first + __two_step,
  1536.                      __result);
  1537.     __first += __two_step;
  1538.   }
  1539.  
  1540.   __step_size = min(_Distance(__last - __first), __step_size);
  1541.   merge(__first, __first + __step_size, __first + __step_size, __last,
  1542.         __result);
  1543. }
  1544.  
  1545. template <class _RandomAccessIter1, class _RandomAccessIter2,
  1546.           class _Distance, class _Compare>
  1547. void __merge_sort_loop(_RandomAccessIter1 __first,
  1548.                        _RandomAccessIter1 __last, 
  1549.                        _RandomAccessIter2 __result, _Distance __step_size,
  1550.                        _Compare __comp) {
  1551.   _Distance __two_step = 2 * __step_size;
  1552.  
  1553.   while (__last - __first >= __two_step) {
  1554.     __result = merge(__first, __first + __step_size,
  1555.                      __first + __step_size, __first + __two_step,
  1556.                      __result,
  1557.                      __comp);
  1558.     __first += __two_step;
  1559.   }
  1560.   __step_size = min(_Distance(__last - __first), __step_size);
  1561.  
  1562.   merge(__first, __first + __step_size,
  1563.         __first + __step_size, __last,
  1564.         __result,
  1565.         __comp);
  1566. }
  1567.  
  1568. const int __stl_chunk_size = 7;
  1569.         
  1570. template <class _RandomAccessIter, class _Distance>
  1571. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1572.                             _RandomAccessIter __last, _Distance __chunk_size)
  1573. {
  1574.   while (__last - __first >= __chunk_size) {
  1575.     __insertion_sort(__first, __first + __chunk_size);
  1576.     __first += __chunk_size;
  1577.   }
  1578.   __insertion_sort(__first, __last);
  1579. }
  1580.  
  1581. template <class _RandomAccessIter, class _Distance, class _Compare>
  1582. void __chunk_insertion_sort(_RandomAccessIter __first, 
  1583.                             _RandomAccessIter __last,
  1584.                             _Distance __chunk_size, _Compare __comp)
  1585. {
  1586.   while (__last - __first >= __chunk_size) {
  1587.     __insertion_sort(__first, __first + __chunk_size, __comp);
  1588.     __first += __chunk_size;
  1589.   }
  1590.   __insertion_sort(__first, __last, __comp);
  1591. }
  1592.  
  1593. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1594. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1595.                               _RandomAccessIter __last,
  1596.                               _Pointer __buffer, _Distance*) {
  1597.   _Distance __len = __last - __first;
  1598.   _Pointer __buffer_last = __buffer + __len;
  1599.  
  1600.   _Distance __step_size = __stl_chunk_size;
  1601.   __chunk_insertion_sort(__first, __last, __step_size);
  1602.  
  1603.   while (__step_size < __len) {
  1604.     __merge_sort_loop(__first, __last, __buffer, __step_size);
  1605.     __step_size *= 2;
  1606.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
  1607.     __step_size *= 2;
  1608.   }
  1609. }
  1610.  
  1611. template <class _RandomAccessIter, class _Pointer, class _Distance,
  1612.           class _Compare>
  1613. void __merge_sort_with_buffer(_RandomAccessIter __first, 
  1614.                               _RandomAccessIter __last, _Pointer __buffer,
  1615.                               _Distance*, _Compare __comp) {
  1616.   _Distance __len = __last - __first;
  1617.   _Pointer __buffer_last = __buffer + __len;
  1618.  
  1619.   _Distance __step_size = __stl_chunk_size;
  1620.   __chunk_insertion_sort(__first, __last, __step_size, __comp);
  1621.  
  1622.   while (__step_size < __len) {
  1623.     __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
  1624.     __step_size *= 2;
  1625.     __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
  1626.     __step_size *= 2;
  1627.   }
  1628. }
  1629.  
  1630. template <class _RandomAccessIter, class _Pointer, class _Distance>
  1631. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1632.                             _RandomAccessIter __last, _Pointer __buffer,
  1633.                             _Distance __buffer_size) {
  1634.   _Distance __len = (__last - __first + 1) / 2;
  1635.   _RandomAccessIter __middle = __first + __len;
  1636.   if (__len > __buffer_size) {
  1637.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
  1638.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
  1639.   }
  1640.   else {
  1641.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
  1642.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
  1643.   }
  1644.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1645.                    _Distance(__last - __middle), __buffer, __buffer_size);
  1646. }
  1647.  
  1648. template <class _RandomAccessIter, class _Pointer, class _Distance, 
  1649.           class _Compare>
  1650. void __stable_sort_adaptive(_RandomAccessIter __first, 
  1651.                             _RandomAccessIter __last, _Pointer __buffer,
  1652.                             _Distance __buffer_size, _Compare __comp) {
  1653.   _Distance __len = (__last - __first + 1) / 2;
  1654.   _RandomAccessIter __middle = __first + __len;
  1655.   if (__len > __buffer_size) {
  1656.     __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, 
  1657.                            __comp);
  1658.     __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size, 
  1659.                            __comp);
  1660.   }
  1661.   else {
  1662.     __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
  1663.                                __comp);
  1664.     __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
  1665.                                __comp);
  1666.   }
  1667.   __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
  1668.                    _Distance(__last - __middle), __buffer, __buffer_size,
  1669.                    __comp);
  1670. }
  1671.  
  1672. template <class _RandomAccessIter, class _Tp, class _Distance>
  1673. inline void __stable_sort_aux(_RandomAccessIter __first,
  1674.                               _RandomAccessIter __last, _Tp*, _Distance*) {
  1675.   _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
  1676.   if (buf.begin() == 0)
  1677.     __inplace_stable_sort(__first, __last);
  1678.   else 
  1679.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1680.                            _Distance(buf.size()));
  1681. }
  1682.  
  1683. template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
  1684. inline void __stable_sort_aux(_RandomAccessIter __first,
  1685.                               _RandomAccessIter __last, _Tp*, _Distance*,
  1686.                               _Compare __comp) {
  1687.   _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
  1688.   if (buf.begin() == 0)
  1689.     __inplace_stable_sort(__first, __last, __comp);
  1690.   else 
  1691.     __stable_sort_adaptive(__first, __last, buf.begin(),
  1692.                            _Distance(buf.size()),
  1693.                            __comp);
  1694. }
  1695.  
  1696. template <class _RandomAccessIter>
  1697. inline void stable_sort(_RandomAccessIter __first,
  1698.                         _RandomAccessIter __last) {
  1699.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1700.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1701.                  _LessThanComparable);
  1702.   __stable_sort_aux(__first, __last,
  1703.                     __VALUE_TYPE(__first),
  1704.                     __DISTANCE_TYPE(__first));
  1705. }
  1706.  
  1707. template <class _RandomAccessIter, class _Compare>
  1708. inline void stable_sort(_RandomAccessIter __first,
  1709.                         _RandomAccessIter __last, _Compare __comp) {
  1710.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1711.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1712.        typename iterator_traits<_RandomAccessIter>::value_type,
  1713.        typename iterator_traits<_RandomAccessIter>::value_type);
  1714.   __stable_sort_aux(__first, __last,
  1715.                     __VALUE_TYPE(__first),
  1716.                     __DISTANCE_TYPE(__first), 
  1717.                     __comp);
  1718. }
  1719.  
  1720. // partial_sort, partial_sort_copy, and auxiliary functions.
  1721.  
  1722. template <class _RandomAccessIter, class _Tp>
  1723. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1724.                     _RandomAccessIter __last, _Tp*) {
  1725.   make_heap(__first, __middle);
  1726.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1727.     if (*__i < *__first) 
  1728.       __pop_heap(__first, __middle, __i, _Tp(*__i),
  1729.                  __DISTANCE_TYPE(__first));
  1730.   sort_heap(__first, __middle);
  1731. }
  1732.  
  1733. template <class _RandomAccessIter>
  1734. inline void partial_sort(_RandomAccessIter __first,
  1735.                          _RandomAccessIter __middle,
  1736.                          _RandomAccessIter __last) {
  1737.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1738.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1739.                  _LessThanComparable);
  1740.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));
  1741. }
  1742.  
  1743. template <class _RandomAccessIter, class _Tp, class _Compare>
  1744. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  1745.                     _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1746.   make_heap(__first, __middle, __comp);
  1747.   for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  1748.     if (__comp(*__i, *__first))
  1749.       __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
  1750.                  __DISTANCE_TYPE(__first));
  1751.   sort_heap(__first, __middle, __comp);
  1752. }
  1753.  
  1754. template <class _RandomAccessIter, class _Compare>
  1755. inline void partial_sort(_RandomAccessIter __first,
  1756.                          _RandomAccessIter __middle,
  1757.                          _RandomAccessIter __last, _Compare __comp) {
  1758.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1759.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, 
  1760.       typename iterator_traits<_RandomAccessIter>::value_type,
  1761.       typename iterator_traits<_RandomAccessIter>::value_type);
  1762.   __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);
  1763. }
  1764.  
  1765. template <class _InputIter, class _RandomAccessIter, class _Distance,
  1766.           class _Tp>
  1767. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1768.                                       _InputIter __last,
  1769.                                       _RandomAccessIter __result_first,
  1770.                                       _RandomAccessIter __result_last, 
  1771.                                       _Distance*, _Tp*) {
  1772.   if (__result_first == __result_last) return __result_last;
  1773.   _RandomAccessIter __result_real_last = __result_first;
  1774.   while(__first != __last && __result_real_last != __result_last) {
  1775.     *__result_real_last = *__first;
  1776.     ++__result_real_last;
  1777.     ++__first;
  1778.   }
  1779.   make_heap(__result_first, __result_real_last);
  1780.   while (__first != __last) {
  1781.     if (*__first < *__result_first) 
  1782.       __adjust_heap(__result_first, _Distance(0),
  1783.                     _Distance(__result_real_last - __result_first),
  1784.                     _Tp(*__first));
  1785.     ++__first;
  1786.   }
  1787.   sort_heap(__result_first, __result_real_last);
  1788.   return __result_real_last;
  1789. }
  1790.  
  1791. template <class _InputIter, class _RandomAccessIter>
  1792. inline _RandomAccessIter
  1793. partial_sort_copy(_InputIter __first, _InputIter __last,
  1794.                   _RandomAccessIter __result_first,
  1795.                   _RandomAccessIter __result_last) {
  1796.   __STL_REQUIRES(_InputIter, _InputIterator);
  1797.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1798.   __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
  1799.                     typename iterator_traits<_RandomAccessIter>::value_type);
  1800.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1801.                  _LessThanComparable);
  1802.   __STL_REQUIRES(typename iterator_traits<_InputIter>::value_type,
  1803.                  _LessThanComparable);
  1804.   return __partial_sort_copy(__first, __last, __result_first, __result_last, 
  1805.                              __DISTANCE_TYPE(__result_first),
  1806.                              __VALUE_TYPE(__first));
  1807. }
  1808.  
  1809. template <class _InputIter, class _RandomAccessIter, class _Compare,
  1810.           class _Distance, class _Tp>
  1811. _RandomAccessIter __partial_sort_copy(_InputIter __first,
  1812.                                          _InputIter __last,
  1813.                                          _RandomAccessIter __result_first,
  1814.                                          _RandomAccessIter __result_last,
  1815.                                          _Compare __comp, _Distance*, _Tp*) {
  1816.   if (__result_first == __result_last) return __result_last;
  1817.   _RandomAccessIter __result_real_last = __result_first;
  1818.   while(__first != __last && __result_real_last != __result_last) {
  1819.     *__result_real_last = *__first;
  1820.     ++__result_real_last;
  1821.     ++__first;
  1822.   }
  1823.   make_heap(__result_first, __result_real_last, __comp);
  1824.   while (__first != __last) {
  1825.     if (__comp(*__first, *__result_first))
  1826.       __adjust_heap(__result_first, _Distance(0),
  1827.                     _Distance(__result_real_last - __result_first),
  1828.                     _Tp(*__first),
  1829.                     __comp);
  1830.     ++__first;
  1831.   }
  1832.   sort_heap(__result_first, __result_real_last, __comp);
  1833.   return __result_real_last;
  1834. }
  1835.  
  1836. template <class _InputIter, class _RandomAccessIter, class _Compare>
  1837. inline _RandomAccessIter
  1838. partial_sort_copy(_InputIter __first, _InputIter __last,
  1839.                   _RandomAccessIter __result_first,
  1840.                   _RandomAccessIter __result_last, _Compare __comp) {
  1841.   __STL_REQUIRES(_InputIter, _InputIterator);
  1842.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1843.   __STL_CONVERTIBLE(typename iterator_traits<_InputIter>::value_type,
  1844.                     typename iterator_traits<_RandomAccessIter>::value_type);
  1845.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1846.      typename iterator_traits<_RandomAccessIter>::value_type,
  1847.      typename iterator_traits<_RandomAccessIter>::value_type);  
  1848.   return __partial_sort_copy(__first, __last, __result_first, __result_last,
  1849.                              __comp,
  1850.                              __DISTANCE_TYPE(__result_first),
  1851.                              __VALUE_TYPE(__first));
  1852. }
  1853.  
  1854. // nth_element() and its auxiliary functions.  
  1855.  
  1856. template <class _RandomAccessIter, class _Tp>
  1857. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1858.                    _RandomAccessIter __last, _Tp*) {
  1859.   while (__last - __first > 3) {
  1860.     _RandomAccessIter __cut =
  1861.       __unguarded_partition(__first, __last,
  1862.                             _Tp(__median(*__first,
  1863.                                          *(__first + (__last - __first)/2),
  1864.                                          *(__last - 1))));
  1865.     if (__cut <= __nth)
  1866.       __first = __cut;
  1867.     else 
  1868.       __last = __cut;
  1869.   }
  1870.   __insertion_sort(__first, __last);
  1871. }
  1872.  
  1873. template <class _RandomAccessIter>
  1874. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1875.                         _RandomAccessIter __last) {
  1876.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1877.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  1878.                  _LessThanComparable);
  1879.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
  1880. }
  1881.  
  1882. template <class _RandomAccessIter, class _Tp, class _Compare>
  1883. void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1884.                    _RandomAccessIter __last, _Tp*, _Compare __comp) {
  1885.   while (__last - __first > 3) {
  1886.     _RandomAccessIter __cut =
  1887.       __unguarded_partition(__first, __last,
  1888.                             _Tp(__median(*__first,
  1889.                                          *(__first + (__last - __first)/2), 
  1890.                                          *(__last - 1),
  1891.                                          __comp)),
  1892.                             __comp);
  1893.     if (__cut <= __nth)
  1894.       __first = __cut;
  1895.     else 
  1896.       __last = __cut;
  1897.   }
  1898.   __insertion_sort(__first, __last, __comp);
  1899. }
  1900.  
  1901. template <class _RandomAccessIter, class _Compare>
  1902. inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
  1903.                         _RandomAccessIter __last, _Compare __comp) {
  1904.   __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  1905.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  1906.      typename iterator_traits<_RandomAccessIter>::value_type,
  1907.      typename iterator_traits<_RandomAccessIter>::value_type);
  1908.   __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);
  1909. }
  1910.  
  1911.  
  1912. // Binary search (lower_bound, upper_bound, equal_range, binary_search).
  1913.  
  1914. template <class _ForwardIter, class _Tp, class _Distance>
  1915. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1916.                            const _Tp& __val, _Distance*) 
  1917. {
  1918.   _Distance __len = 0;
  1919.   distance(__first, __last, __len);
  1920.   _Distance __half;
  1921.   _ForwardIter __middle;
  1922.  
  1923.   while (__len > 0) {
  1924.     __half = __len >> 1;
  1925.     __middle = __first;
  1926.     advance(__middle, __half);
  1927.     if (*__middle < __val) {
  1928.       __first = __middle;
  1929.       ++__first;
  1930.       __len = __len - __half - 1;
  1931.     }
  1932.     else
  1933.       __len = __half;
  1934.   }
  1935.   return __first;
  1936. }
  1937.  
  1938. template <class _ForwardIter, class _Tp>
  1939. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1940.                 const _Tp& __val) {
  1941.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1942.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1943.       typename iterator_traits<_ForwardIter>::value_type);
  1944.   __STL_REQUIRES(_Tp, _LessThanComparable);
  1945.   return __lower_bound(__first, __last, __val,
  1946.                        __DISTANCE_TYPE(__first));
  1947. }
  1948.  
  1949. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  1950. _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
  1951.                               const _Tp& __val, _Compare __comp, _Distance*)
  1952. {
  1953.   _Distance __len = 0;
  1954.   distance(__first, __last, __len);
  1955.   _Distance __half;
  1956.   _ForwardIter __middle;
  1957.  
  1958.   while (__len > 0) {
  1959.     __half = __len >> 1;
  1960.     __middle = __first;
  1961.     advance(__middle, __half);
  1962.     if (__comp(*__middle, __val)) {
  1963.       __first = __middle;
  1964.       ++__first;
  1965.       __len = __len - __half - 1;
  1966.     }
  1967.     else
  1968.       __len = __half;
  1969.   }
  1970.   return __first;
  1971. }
  1972.  
  1973. template <class _ForwardIter, class _Tp, class _Compare>
  1974. inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
  1975.                                 const _Tp& __val, _Compare __comp) {
  1976.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  1977.   __STL_REQUIRES_SAME_TYPE(_Tp,
  1978.       typename iterator_traits<_ForwardIter>::value_type);
  1979.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  1980.   return __lower_bound(__first, __last, __val, __comp,
  1981.                        __DISTANCE_TYPE(__first));
  1982. }
  1983.  
  1984. template <class _ForwardIter, class _Tp, class _Distance>
  1985. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  1986.                            const _Tp& __val, _Distance*)
  1987. {
  1988.   _Distance __len = 0;
  1989.   distance(__first, __last, __len);
  1990.   _Distance __half;
  1991.   _ForwardIter __middle;
  1992.  
  1993.   while (__len > 0) {
  1994.     __half = __len >> 1;
  1995.     __middle = __first;
  1996.     advance(__middle, __half);
  1997.     if (__val < *__middle)
  1998.       __len = __half;
  1999.     else {
  2000.       __first = __middle;
  2001.       ++__first;
  2002.       __len = __len - __half - 1;
  2003.     }
  2004.   }
  2005.   return __first;
  2006. }
  2007.  
  2008. template <class _ForwardIter, class _Tp>
  2009. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  2010.                                 const _Tp& __val) {
  2011.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2012.   __STL_REQUIRES_SAME_TYPE(_Tp,
  2013.       typename iterator_traits<_ForwardIter>::value_type);
  2014.   __STL_REQUIRES(_Tp, _LessThanComparable);
  2015.   return __upper_bound(__first, __last, __val,
  2016.                        __DISTANCE_TYPE(__first));
  2017. }
  2018.  
  2019. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  2020. _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
  2021.                            const _Tp& __val, _Compare __comp, _Distance*)
  2022. {
  2023.   _Distance __len = 0;
  2024.   distance(__first, __last, __len);
  2025.   _Distance __half;
  2026.   _ForwardIter __middle;
  2027.  
  2028.   while (__len > 0) {
  2029.     __half = __len >> 1;
  2030.     __middle = __first;
  2031.     advance(__middle, __half);
  2032.     if (__comp(__val, *__middle))
  2033.       __len = __half;
  2034.     else {
  2035.       __first = __middle;
  2036.       ++__first;
  2037.       __len = __len - __half - 1;
  2038.     }
  2039.   }
  2040.   return __first;
  2041. }
  2042.  
  2043. template <class _ForwardIter, class _Tp, class _Compare>
  2044. inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
  2045.                                 const _Tp& __val, _Compare __comp) {
  2046.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2047.   __STL_REQUIRES_SAME_TYPE(_Tp,
  2048.       typename iterator_traits<_ForwardIter>::value_type);
  2049.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  2050.   return __upper_bound(__first, __last, __val, __comp,
  2051.                        __DISTANCE_TYPE(__first));
  2052. }
  2053.  
  2054. template <class _ForwardIter, class _Tp, class _Distance>
  2055. pair<_ForwardIter, _ForwardIter>
  2056. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  2057.               _Distance*)
  2058. {
  2059.   _Distance __len = 0;
  2060.   distance(__first, __last, __len);
  2061.   _Distance __half;
  2062.   _ForwardIter __middle, __left, __right;
  2063.  
  2064.   while (__len > 0) {
  2065.     __half = __len >> 1;
  2066.     __middle = __first;
  2067.     advance(__middle, __half);
  2068.     if (*__middle < __val) {
  2069.       __first = __middle;
  2070.       ++__first;
  2071.       __len = __len - __half - 1;
  2072.     }
  2073.     else if (__val < *__middle)
  2074.       __len = __half;
  2075.     else {
  2076.       __left = lower_bound(__first, __middle, __val);
  2077.       advance(__first, __len);
  2078.       __right = upper_bound(++__middle, __first, __val);
  2079.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  2080.     }
  2081.   }
  2082.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  2083. }
  2084.  
  2085. template <class _ForwardIter, class _Tp>
  2086. inline pair<_ForwardIter, _ForwardIter>
  2087. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
  2088.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2089.   __STL_REQUIRES_SAME_TYPE(_Tp, 
  2090.        typename iterator_traits<_ForwardIter>::value_type);
  2091.   __STL_REQUIRES(_Tp, _LessThanComparable);
  2092.   return __equal_range(__first, __last, __val,
  2093.                        __DISTANCE_TYPE(__first));
  2094. }
  2095.  
  2096. template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
  2097. pair<_ForwardIter, _ForwardIter>
  2098. __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  2099.               _Compare __comp, _Distance*)
  2100. {
  2101.   _Distance __len = 0;
  2102.   distance(__first, __last, __len);
  2103.   _Distance __half;
  2104.   _ForwardIter __middle, __left, __right;
  2105.  
  2106.   while (__len > 0) {
  2107.     __half = __len >> 1;
  2108.     __middle = __first;
  2109.     advance(__middle, __half);
  2110.     if (__comp(*__middle, __val)) {
  2111.       __first = __middle;
  2112.       ++__first;
  2113.       __len = __len - __half - 1;
  2114.     }
  2115.     else if (__comp(__val, *__middle))
  2116.       __len = __half;
  2117.     else {
  2118.       __left = lower_bound(__first, __middle, __val, __comp);
  2119.       advance(__first, __len);
  2120.       __right = upper_bound(++__middle, __first, __val, __comp);
  2121.       return pair<_ForwardIter, _ForwardIter>(__left, __right);
  2122.     }
  2123.   }
  2124.   return pair<_ForwardIter, _ForwardIter>(__first, __first);
  2125. }           
  2126.  
  2127. template <class _ForwardIter, class _Tp, class _Compare>
  2128. inline pair<_ForwardIter, _ForwardIter>
  2129. equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
  2130.             _Compare __comp) {
  2131.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2132.   __STL_REQUIRES_SAME_TYPE(_Tp, 
  2133.        typename iterator_traits<_ForwardIter>::value_type);
  2134.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  2135.   return __equal_range(__first, __last, __val, __comp,
  2136.                        __DISTANCE_TYPE(__first));
  2137.  
  2138. template <class _ForwardIter, class _Tp>
  2139. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  2140.                    const _Tp& __val) {
  2141.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2142.   __STL_REQUIRES_SAME_TYPE(_Tp,
  2143.         typename iterator_traits<_ForwardIter>::value_type);
  2144.   __STL_REQUIRES(_Tp, _LessThanComparable);
  2145.   _ForwardIter __i = lower_bound(__first, __last, __val);
  2146.   return __i != __last && !(__val < *__i);
  2147. }
  2148.  
  2149. template <class _ForwardIter, class _Tp, class _Compare>
  2150. bool binary_search(_ForwardIter __first, _ForwardIter __last,
  2151.                    const _Tp& __val,
  2152.                    _Compare __comp) {
  2153.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2154.   __STL_REQUIRES_SAME_TYPE(_Tp,
  2155.         typename iterator_traits<_ForwardIter>::value_type);
  2156.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
  2157.   _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
  2158.   return __i != __last && !__comp(__val, *__i);
  2159. }
  2160.  
  2161. // merge, with and without an explicitly supplied comparison function.
  2162.  
  2163. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2164. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  2165.                   _InputIter2 __first2, _InputIter2 __last2,
  2166.                   _OutputIter __result) {
  2167.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2168.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2169.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2170.   __STL_REQUIRES_SAME_TYPE(
  2171.           typename iterator_traits<_InputIter1>::value_type,
  2172.           typename iterator_traits<_InputIter2>::value_type);
  2173.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2174.                  _LessThanComparable);
  2175.   while (__first1 != __last1 && __first2 != __last2) {
  2176.     if (*__first2 < *__first1) {
  2177.       *__result = *__first2;
  2178.       ++__first2;
  2179.     }
  2180.     else {
  2181.       *__result = *__first1;
  2182.       ++__first1;
  2183.     }
  2184.     ++__result;
  2185.   }
  2186.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2187. }
  2188.  
  2189. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2190.           class _Compare>
  2191. _OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
  2192.                   _InputIter2 __first2, _InputIter2 __last2,
  2193.                   _OutputIter __result, _Compare __comp) {
  2194.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2195.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2196.   __STL_REQUIRES_SAME_TYPE(
  2197.           typename iterator_traits<_InputIter1>::value_type,
  2198.           typename iterator_traits<_InputIter2>::value_type);
  2199.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2200.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2201.           typename iterator_traits<_InputIter1>::value_type,
  2202.           typename iterator_traits<_InputIter1>::value_type);
  2203.   while (__first1 != __last1 && __first2 != __last2) {
  2204.     if (__comp(*__first2, *__first1)) {
  2205.       *__result = *__first2;
  2206.       ++__first2;
  2207.     }
  2208.     else {
  2209.       *__result = *__first1;
  2210.       ++__first1;
  2211.     }
  2212.     ++__result;
  2213.   }
  2214.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2215. }
  2216.  
  2217. // inplace_merge and its auxiliary functions. 
  2218.  
  2219. template <class _BidirectionalIter, class _Distance>
  2220. void __merge_without_buffer(_BidirectionalIter __first,
  2221.                             _BidirectionalIter __middle,
  2222.                             _BidirectionalIter __last,
  2223.                             _Distance __len1, _Distance __len2) {
  2224.   if (__len1 == 0 || __len2 == 0)
  2225.     return;
  2226.   if (__len1 + __len2 == 2) {
  2227.     if (*__middle < *__first)
  2228.       iter_swap(__first, __middle);
  2229.     return;
  2230.   }
  2231.   _BidirectionalIter __first_cut = __first;
  2232.   _BidirectionalIter __second_cut = __middle;
  2233.   _Distance __len11 = 0;
  2234.   _Distance __len22 = 0;
  2235.   if (__len1 > __len2) {
  2236.     __len11 = __len1 / 2;
  2237.     advance(__first_cut, __len11);
  2238.     __second_cut = lower_bound(__middle, __last, *__first_cut);
  2239.     distance(__middle, __second_cut, __len22);
  2240.   }
  2241.   else {
  2242.     __len22 = __len2 / 2;
  2243.     advance(__second_cut, __len22);
  2244.     __first_cut = upper_bound(__first, __middle, *__second_cut);
  2245.     distance(__first, __first_cut, __len11);
  2246.   }
  2247.   _BidirectionalIter __new_middle
  2248.     = rotate(__first_cut, __middle, __second_cut);
  2249.   __merge_without_buffer(__first, __first_cut, __new_middle,
  2250.                          __len11, __len22);
  2251.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  2252.                          __len2 - __len22);
  2253. }
  2254.  
  2255. template <class _BidirectionalIter, class _Distance, class _Compare>
  2256. void __merge_without_buffer(_BidirectionalIter __first,
  2257.                             _BidirectionalIter __middle,
  2258.                             _BidirectionalIter __last,
  2259.                             _Distance __len1, _Distance __len2,
  2260.                             _Compare __comp) {
  2261.   if (__len1 == 0 || __len2 == 0)
  2262.     return;
  2263.   if (__len1 + __len2 == 2) {
  2264.     if (__comp(*__middle, *__first))
  2265.       iter_swap(__first, __middle);
  2266.     return;
  2267.   }
  2268.   _BidirectionalIter __first_cut = __first;
  2269.   _BidirectionalIter __second_cut = __middle;
  2270.   _Distance __len11 = 0;
  2271.   _Distance __len22 = 0;
  2272.   if (__len1 > __len2) {
  2273.     __len11 = __len1 / 2;
  2274.     advance(__first_cut, __len11);
  2275.     __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  2276.     distance(__middle, __second_cut, __len22);
  2277.   }
  2278.   else {
  2279.     __len22 = __len2 / 2;
  2280.     advance(__second_cut, __len22);
  2281.     __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  2282.     distance(__first, __first_cut, __len11);
  2283.   }
  2284.   _BidirectionalIter __new_middle
  2285.     = rotate(__first_cut, __middle, __second_cut);
  2286.   __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
  2287.                          __comp);
  2288.   __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
  2289.                          __len2 - __len22, __comp);
  2290. }
  2291.  
  2292. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2293.           class _Distance>
  2294. _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
  2295.                                       _BidirectionalIter1 __middle,
  2296.                                       _BidirectionalIter1 __last,
  2297.                                       _Distance __len1, _Distance __len2,
  2298.                                       _BidirectionalIter2 __buffer,
  2299.                                       _Distance __buffer_size) {
  2300.   _BidirectionalIter2 __buffer_end;
  2301.   if (__len1 > __len2 && __len2 <= __buffer_size) {
  2302.     __buffer_end = copy(__middle, __last, __buffer);
  2303.     copy_backward(__first, __middle, __last);
  2304.     return copy(__buffer, __buffer_end, __first);
  2305.   }
  2306.   else if (__len1 <= __buffer_size) {
  2307.     __buffer_end = copy(__first, __middle, __buffer);
  2308.     copy(__middle, __last, __first);
  2309.     return copy_backward(__buffer, __buffer_end, __last);
  2310.   }
  2311.   else
  2312.     return rotate(__first, __middle, __last);
  2313. }
  2314.  
  2315. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2316.           class _BidirectionalIter3>
  2317. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  2318.                                      _BidirectionalIter1 __last1,
  2319.                                      _BidirectionalIter2 __first2,
  2320.                                      _BidirectionalIter2 __last2,
  2321.                                      _BidirectionalIter3 __result) {
  2322.   if (__first1 == __last1)
  2323.     return copy_backward(__first2, __last2, __result);
  2324.   if (__first2 == __last2)
  2325.     return copy_backward(__first1, __last1, __result);
  2326.   --__last1;
  2327.   --__last2;
  2328.   while (true) {
  2329.     if (*__last2 < *__last1) {
  2330.       *--__result = *__last1;
  2331.       if (__first1 == __last1)
  2332.         return copy_backward(__first2, ++__last2, __result);
  2333.       --__last1;
  2334.     }
  2335.     else {
  2336.       *--__result = *__last2;
  2337.       if (__first2 == __last2)
  2338.         return copy_backward(__first1, ++__last1, __result);
  2339.       --__last2;
  2340.     }
  2341.   }
  2342. }
  2343.  
  2344. template <class _BidirectionalIter1, class _BidirectionalIter2,
  2345.           class _BidirectionalIter3, class _Compare>
  2346. _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
  2347.                                      _BidirectionalIter1 __last1,
  2348.                                      _BidirectionalIter2 __first2,
  2349.                                      _BidirectionalIter2 __last2,
  2350.                                      _BidirectionalIter3 __result,
  2351.                                      _Compare __comp) {
  2352.   if (__first1 == __last1)
  2353.     return copy_backward(__first2, __last2, __result);
  2354.   if (__first2 == __last2)
  2355.     return copy_backward(__first1, __last1, __result);
  2356.   --__last1;
  2357.   --__last2;
  2358.   while (true) {
  2359.     if (__comp(*__last2, *__last1)) {
  2360.       *--__result = *__last1;
  2361.       if (__first1 == __last1)
  2362.         return copy_backward(__first2, ++__last2, __result);
  2363.       --__last1;
  2364.     }
  2365.     else {
  2366.       *--__result = *__last2;
  2367.       if (__first2 == __last2)
  2368.         return copy_backward(__first1, ++__last1, __result);
  2369.       --__last2;
  2370.     }
  2371.   }
  2372. }
  2373.  
  2374. template <class _BidirectionalIter, class _Distance, class _Pointer>
  2375. void __merge_adaptive(_BidirectionalIter __first,
  2376.                       _BidirectionalIter __middle, 
  2377.                       _BidirectionalIter __last,
  2378.                       _Distance __len1, _Distance __len2,
  2379.                       _Pointer __buffer, _Distance __buffer_size) {
  2380.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  2381.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  2382.     merge(__buffer, __buffer_end, __middle, __last, __first);
  2383.   }
  2384.   else if (__len2 <= __buffer_size) {
  2385.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  2386.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
  2387.   }
  2388.   else {
  2389.     _BidirectionalIter __first_cut = __first;
  2390.     _BidirectionalIter __second_cut = __middle;
  2391.     _Distance __len11 = 0;
  2392.     _Distance __len22 = 0;
  2393.     if (__len1 > __len2) {
  2394.       __len11 = __len1 / 2;
  2395.       advance(__first_cut, __len11);
  2396.       __second_cut = lower_bound(__middle, __last, *__first_cut);
  2397.       distance(__middle, __second_cut, __len22); 
  2398.     }
  2399.     else {
  2400.       __len22 = __len2 / 2;
  2401.       advance(__second_cut, __len22);
  2402.       __first_cut = upper_bound(__first, __middle, *__second_cut);
  2403.       distance(__first, __first_cut, __len11);
  2404.     }
  2405.     _BidirectionalIter __new_middle =
  2406.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  2407.                         __len22, __buffer, __buffer_size);
  2408.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  2409.                      __len22, __buffer, __buffer_size);
  2410.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  2411.                      __len2 - __len22, __buffer, __buffer_size);
  2412.   }
  2413. }
  2414.  
  2415. template <class _BidirectionalIter, class _Distance, class _Pointer,
  2416.           class _Compare>
  2417. void __merge_adaptive(_BidirectionalIter __first, 
  2418.                       _BidirectionalIter __middle, 
  2419.                       _BidirectionalIter __last,
  2420.                       _Distance __len1, _Distance __len2,
  2421.                       _Pointer __buffer, _Distance __buffer_size,
  2422.                       _Compare __comp) {
  2423.   if (__len1 <= __len2 && __len1 <= __buffer_size) {
  2424.     _Pointer __buffer_end = copy(__first, __middle, __buffer);
  2425.     merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
  2426.   }
  2427.   else if (__len2 <= __buffer_size) {
  2428.     _Pointer __buffer_end = copy(__middle, __last, __buffer);
  2429.     __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
  2430.                      __comp);
  2431.   }
  2432.   else {
  2433.     _BidirectionalIter __first_cut = __first;
  2434.     _BidirectionalIter __second_cut = __middle;
  2435.     _Distance __len11 = 0;
  2436.     _Distance __len22 = 0;
  2437.     if (__len1 > __len2) {
  2438.       __len11 = __len1 / 2;
  2439.       advance(__first_cut, __len11);
  2440.       __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
  2441.       distance(__middle, __second_cut, __len22);   
  2442.     }
  2443.     else {
  2444.       __len22 = __len2 / 2;
  2445.       advance(__second_cut, __len22);
  2446.       __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
  2447.       distance(__first, __first_cut, __len11);
  2448.     }
  2449.     _BidirectionalIter __new_middle =
  2450.       __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
  2451.                         __len22, __buffer, __buffer_size);
  2452.     __merge_adaptive(__first, __first_cut, __new_middle, __len11,
  2453.                      __len22, __buffer, __buffer_size, __comp);
  2454.     __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
  2455.                      __len2 - __len22, __buffer, __buffer_size, __comp);
  2456.   }
  2457. }
  2458.  
  2459. template <class _BidirectionalIter, class _Tp, class _Distance>
  2460. inline void __inplace_merge_aux(_BidirectionalIter __first,
  2461.                                 _BidirectionalIter __middle,
  2462.                                 _BidirectionalIter __last, _Tp*, _Distance*) {
  2463.   _Distance __len1 = 0;
  2464.   distance(__first, __middle, __len1);
  2465.   _Distance __len2 = 0;
  2466.   distance(__middle, __last, __len2);
  2467.  
  2468.   _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
  2469.   if (__buf.begin() == 0)
  2470.     __merge_without_buffer(__first, __middle, __last, __len1, __len2);
  2471.   else
  2472.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  2473.                      __buf.begin(), _Distance(__buf.size()));
  2474. }
  2475.  
  2476. template <class _BidirectionalIter, class _Tp, 
  2477.           class _Distance, class _Compare>
  2478. inline void __inplace_merge_aux(_BidirectionalIter __first,
  2479.                                 _BidirectionalIter __middle,
  2480.                                 _BidirectionalIter __last, _Tp*, _Distance*,
  2481.                                 _Compare __comp) {
  2482.   _Distance __len1 = 0;
  2483.   distance(__first, __middle, __len1);
  2484.   _Distance __len2 = 0;
  2485.   distance(__middle, __last, __len2);
  2486.  
  2487.   _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
  2488.   if (__buf.begin() == 0)
  2489.     __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
  2490.   else
  2491.     __merge_adaptive(__first, __middle, __last, __len1, __len2,
  2492.                      __buf.begin(), _Distance(__buf.size()),
  2493.                      __comp);
  2494. }
  2495.  
  2496. template <class _BidirectionalIter>
  2497. inline void inplace_merge(_BidirectionalIter __first,
  2498.                           _BidirectionalIter __middle,
  2499.                           _BidirectionalIter __last) {
  2500.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  2501.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2502.                  _LessThanComparable);
  2503.   if (__first == __middle || __middle == __last)
  2504.     return;
  2505.   __inplace_merge_aux(__first, __middle, __last,
  2506.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
  2507. }
  2508.  
  2509. template <class _BidirectionalIter, class _Compare>
  2510. inline void inplace_merge(_BidirectionalIter __first,
  2511.                           _BidirectionalIter __middle,
  2512.                           _BidirectionalIter __last, _Compare __comp) {
  2513.   __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
  2514.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2515.            typename iterator_traits<_BidirectionalIter>::value_type,
  2516.            typename iterator_traits<_BidirectionalIter>::value_type);
  2517.   if (__first == __middle || __middle == __last)
  2518.     return;
  2519.   __inplace_merge_aux(__first, __middle, __last,
  2520.                       __VALUE_TYPE(__first), __DISTANCE_TYPE(__first),
  2521.                       __comp);
  2522. }
  2523.  
  2524. // Set algorithms: includes, set_union, set_intersection, set_difference,
  2525. // set_symmetric_difference.  All of these algorithms have the precondition
  2526. // that their input ranges are sorted and the postcondition that their output
  2527. // ranges are sorted.
  2528.  
  2529. template <class _InputIter1, class _InputIter2>
  2530. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  2531.               _InputIter2 __first2, _InputIter2 __last2) {
  2532.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2533.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2534.   __STL_REQUIRES_SAME_TYPE(
  2535.        typename iterator_traits<_InputIter1>::value_type,
  2536.        typename iterator_traits<_InputIter2>::value_type);
  2537.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2538.                  _LessThanComparable);
  2539.   while (__first1 != __last1 && __first2 != __last2)
  2540.     if (*__first2 < *__first1)
  2541.       return false;
  2542.     else if(*__first1 < *__first2) 
  2543.       ++__first1;
  2544.     else
  2545.       ++__first1, ++__first2;
  2546.  
  2547.   return __first2 == __last2;
  2548. }
  2549.  
  2550. template <class _InputIter1, class _InputIter2, class _Compare>
  2551. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  2552.               _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
  2553.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2554.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2555.   __STL_REQUIRES_SAME_TYPE(
  2556.        typename iterator_traits<_InputIter1>::value_type,
  2557.        typename iterator_traits<_InputIter2>::value_type);
  2558.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2559.        typename iterator_traits<_InputIter1>::value_type,
  2560.        typename iterator_traits<_InputIter2>::value_type);
  2561.   while (__first1 != __last1 && __first2 != __last2)
  2562.     if (__comp(*__first2, *__first1))
  2563.       return false;
  2564.     else if(__comp(*__first1, *__first2)) 
  2565.       ++__first1;
  2566.     else
  2567.       ++__first1, ++__first2;
  2568.  
  2569.   return __first2 == __last2;
  2570. }
  2571.  
  2572. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2573. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  2574.                       _InputIter2 __first2, _InputIter2 __last2,
  2575.                       _OutputIter __result) {
  2576.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2577.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2578.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2579.   __STL_REQUIRES_SAME_TYPE(
  2580.        typename iterator_traits<_InputIter1>::value_type,
  2581.        typename iterator_traits<_InputIter2>::value_type);
  2582.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2583.                  _LessThanComparable);
  2584.   while (__first1 != __last1 && __first2 != __last2) {
  2585.     if (*__first1 < *__first2) {
  2586.       *__result = *__first1;
  2587.       ++__first1;
  2588.     }
  2589.     else if (*__first2 < *__first1) {
  2590.       *__result = *__first2;
  2591.       ++__first2;
  2592.     }
  2593.     else {
  2594.       *__result = *__first1;
  2595.       ++__first1;
  2596.       ++__first2;
  2597.     }
  2598.     ++__result;
  2599.   }
  2600.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2601. }
  2602.  
  2603. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2604.           class _Compare>
  2605. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  2606.                       _InputIter2 __first2, _InputIter2 __last2,
  2607.                       _OutputIter __result, _Compare __comp) {
  2608.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2609.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2610.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2611.   __STL_REQUIRES_SAME_TYPE(
  2612.        typename iterator_traits<_InputIter1>::value_type,
  2613.        typename iterator_traits<_InputIter2>::value_type);
  2614.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2615.        typename iterator_traits<_InputIter1>::value_type,
  2616.        typename iterator_traits<_InputIter2>::value_type);
  2617.   while (__first1 != __last1 && __first2 != __last2) {
  2618.     if (__comp(*__first1, *__first2)) {
  2619.       *__result = *__first1;
  2620.       ++__first1;
  2621.     }
  2622.     else if (__comp(*__first2, *__first1)) {
  2623.       *__result = *__first2;
  2624.       ++__first2;
  2625.     }
  2626.     else {
  2627.       *__result = *__first1;
  2628.       ++__first1;
  2629.       ++__first2;
  2630.     }
  2631.     ++__result;
  2632.   }
  2633.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2634. }
  2635.  
  2636. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2637. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2638.                              _InputIter2 __first2, _InputIter2 __last2,
  2639.                              _OutputIter __result) {
  2640.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2641.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2642.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2643.   __STL_REQUIRES_SAME_TYPE(
  2644.        typename iterator_traits<_InputIter1>::value_type,
  2645.        typename iterator_traits<_InputIter2>::value_type);
  2646.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2647.                  _LessThanComparable);
  2648.   while (__first1 != __last1 && __first2 != __last2) 
  2649.     if (*__first1 < *__first2) 
  2650.       ++__first1;
  2651.     else if (*__first2 < *__first1) 
  2652.       ++__first2;
  2653.     else {
  2654.       *__result = *__first1;
  2655.       ++__first1;
  2656.       ++__first2;
  2657.       ++__result;
  2658.     }
  2659.   return __result;
  2660. }
  2661.  
  2662. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2663.           class _Compare>
  2664. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  2665.                              _InputIter2 __first2, _InputIter2 __last2,
  2666.                              _OutputIter __result, _Compare __comp) {
  2667.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2668.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2669.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2670.   __STL_REQUIRES_SAME_TYPE(
  2671.        typename iterator_traits<_InputIter1>::value_type,
  2672.        typename iterator_traits<_InputIter2>::value_type);
  2673.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2674.        typename iterator_traits<_InputIter1>::value_type,
  2675.        typename iterator_traits<_InputIter2>::value_type);
  2676.  
  2677.   while (__first1 != __last1 && __first2 != __last2)
  2678.     if (__comp(*__first1, *__first2))
  2679.       ++__first1;
  2680.     else if (__comp(*__first2, *__first1))
  2681.       ++__first2;
  2682.     else {
  2683.       *__result = *__first1;
  2684.       ++__first1;
  2685.       ++__first2;
  2686.       ++__result;
  2687.     }
  2688.   return __result;
  2689. }
  2690.  
  2691. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2692. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2693.                            _InputIter2 __first2, _InputIter2 __last2,
  2694.                            _OutputIter __result) {
  2695.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2696.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2697.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2698.   __STL_REQUIRES_SAME_TYPE(
  2699.        typename iterator_traits<_InputIter1>::value_type,
  2700.        typename iterator_traits<_InputIter2>::value_type);
  2701.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2702.                  _LessThanComparable);
  2703.   while (__first1 != __last1 && __first2 != __last2)
  2704.     if (*__first1 < *__first2) {
  2705.       *__result = *__first1;
  2706.       ++__first1;
  2707.       ++__result;
  2708.     }
  2709.     else if (*__first2 < *__first1)
  2710.       ++__first2;
  2711.     else {
  2712.       ++__first1;
  2713.       ++__first2;
  2714.     }
  2715.   return copy(__first1, __last1, __result);
  2716. }
  2717.  
  2718. template <class _InputIter1, class _InputIter2, class _OutputIter, 
  2719.           class _Compare>
  2720. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  2721.                            _InputIter2 __first2, _InputIter2 __last2, 
  2722.                            _OutputIter __result, _Compare __comp) {
  2723.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2724.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2725.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2726.   __STL_REQUIRES_SAME_TYPE(
  2727.        typename iterator_traits<_InputIter1>::value_type,
  2728.        typename iterator_traits<_InputIter2>::value_type);
  2729.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2730.        typename iterator_traits<_InputIter1>::value_type,
  2731.        typename iterator_traits<_InputIter2>::value_type);
  2732.  
  2733.   while (__first1 != __last1 && __first2 != __last2)
  2734.     if (__comp(*__first1, *__first2)) {
  2735.       *__result = *__first1;
  2736.       ++__first1;
  2737.       ++__result;
  2738.     }
  2739.     else if (__comp(*__first2, *__first1))
  2740.       ++__first2;
  2741.     else {
  2742.       ++__first1;
  2743.       ++__first2;
  2744.     }
  2745.   return copy(__first1, __last1, __result);
  2746. }
  2747.  
  2748. template <class _InputIter1, class _InputIter2, class _OutputIter>
  2749. _OutputIter 
  2750. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2751.                          _InputIter2 __first2, _InputIter2 __last2,
  2752.                          _OutputIter __result) {
  2753.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2754.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2755.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2756.   __STL_REQUIRES_SAME_TYPE(
  2757.        typename iterator_traits<_InputIter1>::value_type,
  2758.        typename iterator_traits<_InputIter2>::value_type);
  2759.   __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  2760.                  _LessThanComparable);
  2761.   while (__first1 != __last1 && __first2 != __last2)
  2762.     if (*__first1 < *__first2) {
  2763.       *__result = *__first1;
  2764.       ++__first1;
  2765.       ++__result;
  2766.     }
  2767.     else if (*__first2 < *__first1) {
  2768.       *__result = *__first2;
  2769.       ++__first2;
  2770.       ++__result;
  2771.     }
  2772.     else {
  2773.       ++__first1;
  2774.       ++__first2;
  2775.     }
  2776.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2777. }
  2778.  
  2779. template <class _InputIter1, class _InputIter2, class _OutputIter,
  2780.           class _Compare>
  2781. _OutputIter 
  2782. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  2783.                          _InputIter2 __first2, _InputIter2 __last2,
  2784.                          _OutputIter __result,
  2785.                          _Compare __comp) {
  2786.   __STL_REQUIRES(_InputIter1, _InputIterator);
  2787.   __STL_REQUIRES(_InputIter2, _InputIterator);
  2788.   __STL_REQUIRES(_OutputIter, _OutputIterator);
  2789.   __STL_REQUIRES_SAME_TYPE(
  2790.        typename iterator_traits<_InputIter1>::value_type,
  2791.        typename iterator_traits<_InputIter2>::value_type);
  2792.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2793.        typename iterator_traits<_InputIter1>::value_type,
  2794.        typename iterator_traits<_InputIter2>::value_type);
  2795.   while (__first1 != __last1 && __first2 != __last2)
  2796.     if (__comp(*__first1, *__first2)) {
  2797.       *__result = *__first1;
  2798.       ++__first1;
  2799.       ++__result;
  2800.     }
  2801.     else if (__comp(*__first2, *__first1)) {
  2802.       *__result = *__first2;
  2803.       ++__first2;
  2804.       ++__result;
  2805.     }
  2806.     else {
  2807.       ++__first1;
  2808.       ++__first2;
  2809.     }
  2810.   return copy(__first2, __last2, copy(__first1, __last1, __result));
  2811. }
  2812.  
  2813. // min_element and max_element, with and without an explicitly supplied
  2814. // comparison function.
  2815.  
  2816. template <class _ForwardIter>
  2817. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
  2818.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2819.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  2820.                  _LessThanComparable);
  2821.   if (__first == __last) return __first;
  2822.   _ForwardIter __result = __first;
  2823.   while (++__first != __last) 
  2824.     if (*__result < *__first)
  2825.       __result = __first;
  2826.   return __result;
  2827. }
  2828.  
  2829. template <class _ForwardIter, class _Compare>
  2830. _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
  2831.              _Compare __comp) {
  2832.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2833.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2834.     typename iterator_traits<_ForwardIter>::value_type,
  2835.     typename iterator_traits<_ForwardIter>::value_type);
  2836.   if (__first == __last) return __first;
  2837.   _ForwardIter __result = __first;
  2838.   while (++__first != __last) 
  2839.     if (__comp(*__result, *__first)) __result = __first;
  2840.   return __result;
  2841. }
  2842.  
  2843. template <class _ForwardIter>
  2844. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
  2845.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2846.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  2847.                  _LessThanComparable);
  2848.   if (__first == __last) return __first;
  2849.   _ForwardIter __result = __first;
  2850.   while (++__first != __last) 
  2851.     if (*__first < *__result)
  2852.       __result = __first;
  2853.   return __result;
  2854. }
  2855.  
  2856. template <class _ForwardIter, class _Compare>
  2857. _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
  2858.              _Compare __comp) {
  2859.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  2860.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2861.     typename iterator_traits<_ForwardIter>::value_type,
  2862.     typename iterator_traits<_ForwardIter>::value_type);
  2863.   if (__first == __last) return __first;
  2864.   _ForwardIter __result = __first;
  2865.   while (++__first != __last) 
  2866.     if (__comp(*__first, *__result))
  2867.       __result = __first;
  2868.   return __result;
  2869. }
  2870.  
  2871. // next_permutation and prev_permutation, with and without an explicitly 
  2872. // supplied comparison function.
  2873.  
  2874. template <class _BidirectionalIter>
  2875. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2876.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2877.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2878.                  _LessThanComparable);
  2879.   if (__first == __last)
  2880.     return false;
  2881.   _BidirectionalIter __i = __first;
  2882.   ++__i;
  2883.   if (__i == __last)
  2884.     return false;
  2885.   __i = __last;
  2886.   --__i;
  2887.  
  2888.   for(;;) {
  2889.     _BidirectionalIter __ii = __i;
  2890.     --__i;
  2891.     if (*__i < *__ii) {
  2892.       _BidirectionalIter __j = __last;
  2893.       while (!(*__i < *--__j))
  2894.         {}
  2895.       iter_swap(__i, __j);
  2896.       reverse(__ii, __last);
  2897.       return true;
  2898.     }
  2899.     if (__i == __first) {
  2900.       reverse(__first, __last);
  2901.       return false;
  2902.     }
  2903.   }
  2904. }
  2905.  
  2906. template <class _BidirectionalIter, class _Compare>
  2907. bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2908.                       _Compare __comp) {
  2909.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2910.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2911.     typename iterator_traits<_BidirectionalIter>::value_type,
  2912.     typename iterator_traits<_BidirectionalIter>::value_type);
  2913.   if (__first == __last)
  2914.     return false;
  2915.   _BidirectionalIter __i = __first;
  2916.   ++__i;
  2917.   if (__i == __last)
  2918.     return false;
  2919.   __i = __last;
  2920.   --__i;
  2921.  
  2922.   for(;;) {
  2923.     _BidirectionalIter __ii = __i;
  2924.     --__i;
  2925.     if (__comp(*__i, *__ii)) {
  2926.       _BidirectionalIter __j = __last;
  2927.       while (!__comp(*__i, *--__j))
  2928.         {}
  2929.       iter_swap(__i, __j);
  2930.       reverse(__ii, __last);
  2931.       return true;
  2932.     }
  2933.     if (__i == __first) {
  2934.       reverse(__first, __last);
  2935.       return false;
  2936.     }
  2937.   }
  2938. }
  2939.  
  2940. template <class _BidirectionalIter>
  2941. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  2942.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2943.   __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
  2944.                  _LessThanComparable);
  2945.   if (__first == __last)
  2946.     return false;
  2947.   _BidirectionalIter __i = __first;
  2948.   ++__i;
  2949.   if (__i == __last)
  2950.     return false;
  2951.   __i = __last;
  2952.   --__i;
  2953.  
  2954.   for(;;) {
  2955.     _BidirectionalIter __ii = __i;
  2956.     --__i;
  2957.     if (*__ii < *__i) {
  2958.       _BidirectionalIter __j = __last;
  2959.       while (!(*--__j < *__i))
  2960.         {}
  2961.       iter_swap(__i, __j);
  2962.       reverse(__ii, __last);
  2963.       return true;
  2964.     }
  2965.     if (__i == __first) {
  2966.       reverse(__first, __last);
  2967.       return false;
  2968.     }
  2969.   }
  2970. }
  2971.  
  2972. template <class _BidirectionalIter, class _Compare>
  2973. bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
  2974.                       _Compare __comp) {
  2975.   __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  2976.   __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  2977.     typename iterator_traits<_BidirectionalIter>::value_type,
  2978.     typename iterator_traits<_BidirectionalIter>::value_type);
  2979.   if (__first == __last)
  2980.     return false;
  2981.   _BidirectionalIter __i = __first;
  2982.   ++__i;
  2983.   if (__i == __last)
  2984.     return false;
  2985.   __i = __last;
  2986.   --__i;
  2987.  
  2988.   for(;;) {
  2989.     _BidirectionalIter __ii = __i;
  2990.     --__i;
  2991.     if (__comp(*__ii, *__i)) {
  2992.       _BidirectionalIter __j = __last;
  2993.       while (!__comp(*--__j, *__i))
  2994.         {}
  2995.       iter_swap(__i, __j);
  2996.       reverse(__ii, __last);
  2997.       return true;
  2998.     }
  2999.     if (__i == __first) {
  3000.       reverse(__first, __last);
  3001.       return false;
  3002.     }
  3003.   }
  3004. }
  3005.  
  3006. // find_first_of, with and without an explicitly supplied comparison function.
  3007.  
  3008. template <class _InputIter, class _ForwardIter>
  3009. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  3010.                          _ForwardIter __first2, _ForwardIter __last2)
  3011. {
  3012.   __STL_REQUIRES(_InputIter, _InputIterator);
  3013.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  3014.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, 
  3015.      typename iterator_traits<_InputIter>::value_type,
  3016.      typename iterator_traits<_ForwardIter>::value_type);
  3017.  
  3018.   for ( ; __first1 != __last1; ++__first1) 
  3019.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  3020.       if (*__first1 == *__iter)
  3021.         return __first1;
  3022.   return __last1;
  3023. }
  3024.  
  3025. template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
  3026. _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
  3027.                          _ForwardIter __first2, _ForwardIter __last2,
  3028.                          _BinaryPredicate __comp)
  3029. {
  3030.   __STL_REQUIRES(_InputIter, _InputIterator);
  3031.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  3032.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  3033.      typename iterator_traits<_InputIter>::value_type,
  3034.      typename iterator_traits<_ForwardIter>::value_type);
  3035.  
  3036.   for ( ; __first1 != __last1; ++__first1) 
  3037.     for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
  3038.       if (__comp(*__first1, *__iter))
  3039.         return __first1;
  3040.   return __last1;
  3041. }
  3042.  
  3043.  
  3044. // find_end, with and without an explicitly supplied comparison function.
  3045. // Search [first2, last2) as a subsequence in [first1, last1), and return
  3046. // the *last* possible match.  Note that find_end for bidirectional iterators
  3047. // is much faster than for forward iterators.
  3048.  
  3049. // find_end for forward iterators. 
  3050. template <class _ForwardIter1, class _ForwardIter2>
  3051. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  3052.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  3053.                          forward_iterator_tag, forward_iterator_tag)
  3054. {
  3055.   if (__first2 == __last2)
  3056.     return __last1;
  3057.   else {
  3058.     _ForwardIter1 __result = __last1;
  3059.     while (1) {
  3060.       _ForwardIter1 __new_result
  3061.         = search(__first1, __last1, __first2, __last2);
  3062.       if (__new_result == __last1)
  3063.         return __result;
  3064.       else {
  3065.         __result = __new_result;
  3066.         __first1 = __new_result;
  3067.         ++__first1;
  3068.       }
  3069.     }
  3070.   }
  3071. }
  3072.  
  3073. template <class _ForwardIter1, class _ForwardIter2,
  3074.           class _BinaryPredicate>
  3075. _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
  3076.                          _ForwardIter2 __first2, _ForwardIter2 __last2,
  3077.                          forward_iterator_tag, forward_iterator_tag,
  3078.                          _BinaryPredicate __comp)
  3079. {
  3080.   if (__first2 == __last2)
  3081.     return __last1;
  3082.   else {
  3083.     _ForwardIter1 __result = __last1;
  3084.     while (1) {
  3085.       _ForwardIter1 __new_result
  3086.         = search(__first1, __last1, __first2, __last2, __comp);
  3087.       if (__new_result == __last1)
  3088.         return __result;
  3089.       else {
  3090.         __result = __new_result;
  3091.         __first1 = __new_result;
  3092.         ++__first1;
  3093.       }
  3094.     }
  3095.   }
  3096. }
  3097.  
  3098. // find_end for bidirectional iterators.  Requires partial specialization.
  3099. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  3100.  
  3101. template <class _BidirectionalIter1, class _BidirectionalIter2>
  3102. _BidirectionalIter1
  3103. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  3104.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  3105.            bidirectional_iterator_tag, bidirectional_iterator_tag)
  3106. {
  3107.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  3108.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  3109.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  3110.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  3111.  
  3112.   _RevIter1 __rlast1(__first1);
  3113.   _RevIter2 __rlast2(__first2);
  3114.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  3115.                                _RevIter2(__last2), __rlast2);
  3116.  
  3117.   if (__rresult == __rlast1)
  3118.     return __last1;
  3119.   else {
  3120.     _BidirectionalIter1 __result = __rresult.base();
  3121.     advance(__result, -distance(__first2, __last2));
  3122.     return __result;
  3123.   }
  3124. }
  3125.  
  3126. template <class _BidirectionalIter1, class _BidirectionalIter2,
  3127.           class _BinaryPredicate>
  3128. _BidirectionalIter1
  3129. __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
  3130.            _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
  3131.            bidirectional_iterator_tag, bidirectional_iterator_tag, 
  3132.            _BinaryPredicate __comp)
  3133. {
  3134.   __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
  3135.   __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
  3136.   typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
  3137.   typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
  3138.  
  3139.   _RevIter1 __rlast1(__first1);
  3140.   _RevIter2 __rlast2(__first2);
  3141.   _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
  3142.                                _RevIter2(__last2), __rlast2,
  3143.                                __comp);
  3144.  
  3145.   if (__rresult == __rlast1)
  3146.     return __last1;
  3147.   else {
  3148.     _BidirectionalIter1 __result = __rresult.base();
  3149.     advance(__result, -distance(__first2, __last2));
  3150.     return __result;
  3151.   }
  3152. }
  3153. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  3154.  
  3155. // Dispatching functions for find_end.
  3156.  
  3157. template <class _ForwardIter1, class _ForwardIter2>
  3158. inline _ForwardIter1 
  3159. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  3160.          _ForwardIter2 __first2, _ForwardIter2 __last2)
  3161. {
  3162.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  3163.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  3164.   __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
  3165.    typename iterator_traits<_ForwardIter1>::value_type,
  3166.    typename iterator_traits<_ForwardIter2>::value_type);
  3167.   return __find_end(__first1, __last1, __first2, __last2,
  3168.                     __ITERATOR_CATEGORY(__first1),
  3169.                     __ITERATOR_CATEGORY(__first2));
  3170. }
  3171.  
  3172. template <class _ForwardIter1, class _ForwardIter2, 
  3173.           class _BinaryPredicate>
  3174. inline _ForwardIter1 
  3175. find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
  3176.          _ForwardIter2 __first2, _ForwardIter2 __last2,
  3177.          _BinaryPredicate __comp)
  3178. {
  3179.   __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
  3180.   __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
  3181.   __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
  3182.    typename iterator_traits<_ForwardIter1>::value_type,
  3183.    typename iterator_traits<_ForwardIter2>::value_type);
  3184.  
  3185.   return __find_end(__first1, __last1, __first2, __last2,
  3186.                     __ITERATOR_CATEGORY(__first1),
  3187.                     __ITERATOR_CATEGORY(__first2),
  3188.                     __comp);
  3189. }
  3190.  
  3191. // is_heap, a predicate testing whether or not a range is
  3192. // a heap.  This function is an extension, not part of the C++
  3193. // standard.
  3194.  
  3195. template <class _RandomAccessIter, class _Distance>
  3196. bool __is_heap(_RandomAccessIter __first, _Distance __n)
  3197. {
  3198.   _Distance __parent = 0;
  3199.   for (_Distance __child = 1; __child < __n; ++__child) {
  3200.     if (__first[__parent] < __first[__child]) 
  3201.       return false;
  3202.     if ((__child & 1) == 0)
  3203.       ++__parent;
  3204.   }
  3205.   return true;
  3206. }
  3207.  
  3208. template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
  3209. bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
  3210.                _Distance __n)
  3211. {
  3212.   _Distance __parent = 0;
  3213.   for (_Distance __child = 1; __child < __n; ++__child) {
  3214.     if (__comp(__first[__parent], __first[__child]))
  3215.       return false;
  3216.     if ((__child & 1) == 0)
  3217.       ++__parent;
  3218.   }
  3219.   return true;
  3220. }
  3221.  
  3222. template <class _RandomAccessIter>
  3223. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
  3224. {
  3225.   __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
  3226.   __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
  3227.                  _LessThanComparable);
  3228.   return __is_heap(__first, __last - __first);
  3229. }
  3230.  
  3231.  
  3232. template <class _RandomAccessIter, class _StrictWeakOrdering>
  3233. inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
  3234.                     _StrictWeakOrdering __comp)
  3235. {
  3236.   __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
  3237.   __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, 
  3238.          typename iterator_traits<_RandomAccessIter>::value_type, 
  3239.          typename iterator_traits<_RandomAccessIter>::value_type);
  3240.   return __is_heap(__first, __comp, __last - __first);
  3241. }
  3242.  
  3243. // is_sorted, a predicated testing whether a range is sorted in
  3244. // nondescending order.  This is an extension, not part of the C++
  3245. // standard.
  3246.  
  3247. template <class _ForwardIter>
  3248. bool is_sorted(_ForwardIter __first, _ForwardIter __last)
  3249. {
  3250.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  3251.   __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
  3252.                  _LessThanComparable);
  3253.   if (__first == __last)
  3254.     return true;
  3255.  
  3256.   _ForwardIter __next = __first;
  3257.   for (++__next; __next != __last; __first = __next, ++__next) {
  3258.     if (*__next < *__first)
  3259.       return false;
  3260.   }
  3261.  
  3262.   return true;
  3263. }
  3264.  
  3265. template <class _ForwardIter, class _StrictWeakOrdering>
  3266. bool is_sorted(_ForwardIter __first, _ForwardIter __last,
  3267.                _StrictWeakOrdering __comp)
  3268. {
  3269.   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  3270.   __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool, 
  3271.         typename iterator_traits<_ForwardIter>::value_type,
  3272.         typename iterator_traits<_ForwardIter>::value_type);
  3273.   if (__first == __last)
  3274.     return true;
  3275.  
  3276.   _ForwardIter __next = __first;
  3277.   for (++__next; __next != __last; __first = __next, ++__next) {
  3278.     if (__comp(*__next, *__first))
  3279.       return false;
  3280.   }
  3281.  
  3282.   return true;
  3283. }
  3284.  
  3285. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  3286. #pragma reset woff 1209
  3287. #endif
  3288.  
  3289. __STL_END_NAMESPACE
  3290.  
  3291. #endif /* __SGI_STL_INTERNAL_ALGO_H */
  3292.  
  3293. // Local Variables:
  3294. // mode:C++
  3295. // End:
  3296.